gpt4 book ai didi

Java、MySQL 连接被输入数据终止

转载 作者:行者123 更新时间:2023-11-30 00:01:22 25 4
gpt4 key购买 nike

我尝试将 CSV 文件读入 MySQL-DB,但文件超过 40000 行。 CSV 阅读器不是问题。我可以将这些行写入 MySQL-DB。但是,当我读取和写入 CSV 的所有行时,我与 MySQL 服务器的连接在此过程中被终止。在我的连接结束之前,该程序已成功读写 1000 多行。我收到以下错误:

java.sql.SQLException: Could not retrieve transation read-only status server

或者

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet successfully received from the server was 328.971 milliseconds ago.  The last packet sent successfully to the server was 328.971 milliseconds ago.

你知道这是为什么吗?

我在 catch block 中编写了一个更新连接的方法,但它读取了几行,并且连接再次被终止。

从 CSV 获取行并加载到 MySQL-DB 的代码

kptoolsDB.setAutoCommit(false);
dateiImpDB.setAutoCommit(false);
while(prop != null && this.isInterrupted() == false)
{
vertragsID = null;
rufNr = null;

try {
setDaten(prop);
kptoolsDB.commit();
dateiImpDB.commit();
} catch (SQLException e) {
e.printStackTrace();
log.log(LogLevel.ERROR, e.toString(), this);
setDBConnections(hilfstabelle);
try {
setDaten(prop);
kptoolsDB.commit();
dateiImpDB.commit();
} catch (SQLException e1) {
log.log(LogLevel.ERROR, e.toString(), this);
setDBConnections(hilfstabelle);
}
}

view.setProgessBarVal(count);

prop = reader.getNextLine();
count++;
}
kptoolsDB.setAutoCommit(true);
dateiImpDB.setAutoCommit(true);

方法setDaten()

private void setDaten(Properties prop) throws SQLException
{
ResultSet rst;

rst = statKPTools.executeQuery("select rechnungsID from isimrechnungeintrag where rawcdr = " + prop.get("i_rawcdr") + ";");
if(rst.next())
{
log.log(LogLevel.INFO, "Die CDR-Nummer " + prop.get("i_rawcdr") + " ist schon eingetragen!", this);
} else {
rst.close();

rufNr = "+" + prop.get("MSISDN").toString().replace("-", "").replace(" ", "");

if(!pruefeRufnummer(rufNr))
{
setRufNrNichtGefunden(rufNr);
} else {
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm");
Date datum = null;
try {
datum = sdf.parse(prop.get("call_start_datetime").toString());
} catch (ParseException e) {
log.log(LogLevel.ERROR, e.toString(), this);
}

prepSetRechEintrag.setInt(1, 5);
prepSetRechEintrag.setLong(3, vertragsID);
prepSetRechEintrag.setDate(2, new java.sql.Date(datum.getTime()));
prepSetRechEintrag.executeUpdate();

rst = statKPTools.executeQuery("select max(ID) from rechnungseintrag;");
if(rst.next())
{
prepSetISIMRechEintag.setLong(1, rst.getLong(1));
prepSetISIMRechEintag.setDouble(2, new Double(prop.get("VK netto").toString().replace(",", ".")));
prepSetISIMRechEintag.setDouble(3, new Double(prop.get("EK netto").toString().replace(",", ".")));
prepSetISIMRechEintag.setInt(4, new Integer(prop.get("event_id").toString()));
prepSetISIMRechEintag.setString(5, prop.get("event").toString());
prepSetISIMRechEintag.setLong(6, new Long(prop.get("i_rawcdr").toString()));
prepSetISIMRechEintag.executeUpdate();

Calendar cal = Calendar.getInstance();
cal.setTime(datum);

prepInsertVolumHilfe.setLong(1, vertragsID);
prepInsertVolumHilfe.setInt(2, new Integer(prop.get("event_id").toString()));
prepInsertVolumHilfe.setString(3, prop.get("event").toString());
prepInsertVolumHilfe.setLong(4, new Long(prop.get("charged_quantity").toString()));
prepInsertVolumHilfe.setInt(5, cal.get(Calendar.MONTH));
prepInsertVolumHilfe.setInt(6, cal.get(Calendar.YEAR));
prepInsertVolumHilfe.executeUpdate();
}
}
}
rst.close();
}

MySQL 连接类

package DatenbankConector;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.PreparedStatement;
import EigeneExceptions.FehlendeLoginDaten;
import Enums.LogLevel;
import Enums.MySQLDatenbanken;
import Hilfsklassen.Logger;

public class MYSQLDB {

private static MYSQLDB loginDB = null;
private static MYSQLDB kptoolsDB = null;
private static MYSQLDB datenImpDB = null;
private static String loginUser = null;
private static String loginPass = null;

private Logger log = Logger.getInstance();

private Connection connect;
private String dbHost = "XXX.XXX.XXX.XXX"; // Hostname
private String dbPort = "3306"; // Port -- Standard: 3306
private String logindbUser = "******"; // Login-Datenbankuser
private String logindbPass = "********"; // Login-Datenbankpasswort
private boolean kannStarten = false;
private MySQLDatenbanken dbEnum;

private MYSQLDB(MySQLDatenbanken db)
{
String strConnect = "";
dbEnum = db;

switch(db)
{
case LOGIN_DB:
strConnect = "jdbc:mysql://"+dbHost+":"+ dbPort+"/logindb?"+"user="+logindbUser+"&"+"password="+logindbPass;
break;
case KPTOOLS_DB:
strConnect = "jdbc:mysql://"+dbHost+":"+ dbPort+"/kptools?"+"user="+loginUser+"&"+"password="+loginPass;
break;
case DATEI_IMP_DB:
strConnect = "jdbc:mysql://"+dbHost+":"+ dbPort+"/dateiimporter?"+"user="+loginUser+"&"+"password="+loginPass;
break;
}

try
{
Class.forName("com.mysql.jdbc.Driver");
connect = DriverManager.getConnection(strConnect);
kannStarten = true;
}
catch (SQLException e) {
log.log(LogLevel.ERROR, e.toString(), this);
kannStarten = false;
}
catch (ClassNotFoundException e) {
log.log(LogLevel.ERROR, e.toString(), this);
kannStarten = false;
}
}

/**
* Gibt eine Instanz von MYSQLDB zurueck.
*
* @param db Angabe welche Datenbank aufgerufen werden soll.
*
* @return ein MYSQLDB Objekt
*
* @throws FehlendeLoginDaten Fehler fals noch keine Logindaten gesetzt wurden.
*/
public static MYSQLDB getInstance(MySQLDatenbanken db) throws FehlendeLoginDaten
{
MYSQLDB obj = null;

switch(db)
{
case LOGIN_DB:
if(loginDB == null)
{
loginDB = new MYSQLDB(MySQLDatenbanken.LOGIN_DB);
obj = loginDB;
} else {
obj = loginDB;
}
break;
case KPTOOLS_DB:
if(kptoolsDB == null)
{
if(loginUser != null && loginPass != null)
{
kptoolsDB = new MYSQLDB(MySQLDatenbanken.KPTOOLS_DB);
obj = kptoolsDB;
} else {
throw new FehlendeLoginDaten();
}
} else {
obj = kptoolsDB;
}
break;
case DATEI_IMP_DB:
if(datenImpDB == null)
{
if(loginUser != null && loginPass != null)
{
datenImpDB = new MYSQLDB(MySQLDatenbanken.DATEI_IMP_DB);
obj = datenImpDB;
} else {
throw new FehlendeLoginDaten();
}
} else {
obj = datenImpDB;
}
break;
}

return obj;
}

/**
* Gibt eine Instanz von MYSQLDB zurueck.
*
* @param db Angabe welche Datenbank aufgerufen werden soll.
* @param user Benutzername für den Datenbanklogin
* @param pass Passwort für den Datenbanklogin
*
* @return ein MYSQLDB Objekt
*
* @throws FehlendeLoginDaten Fehler fals noch keine Logindaten gesetzt wurden.
*/
public static MYSQLDB getInstance(MySQLDatenbanken db, String user, String pass) throws FehlendeLoginDaten
{
MYSQLDB objekt = null;
loginUser = user;
loginPass = pass;

switch(db)
{
case LOGIN_DB:
if(loginDB == null)
{
loginDB = new MYSQLDB(MySQLDatenbanken.LOGIN_DB);
objekt = loginDB;
} else {
objekt = loginDB;
}
break;
case KPTOOLS_DB:
if(kptoolsDB == null)
{
if(loginUser != null && loginPass != null)
{
kptoolsDB = new MYSQLDB(MySQLDatenbanken.KPTOOLS_DB);
objekt = kptoolsDB;
} else {
throw new FehlendeLoginDaten();
}
} else {
objekt = kptoolsDB;
}
break;
case DATEI_IMP_DB:
if(datenImpDB == null)
{
if(loginUser != null && loginPass != null)
{
datenImpDB = new MYSQLDB(MySQLDatenbanken.DATEI_IMP_DB);
objekt = datenImpDB;
} else {
throw new FehlendeLoginDaten();
}
} else {
objekt = datenImpDB;
}
break;
}

return objekt;
}

/**
* Gibt ein Satement Objekt du einer Datenbank zurueck.
*
* @return ein Statement der Datenbankconektion
* @throws SQLException
*/
public Statement getStatement() throws SQLException
{
Statement stat = connect.createStatement();

return stat;
}

/**
* Commitet die Datebankaktionen.
*
* @throws SQLException
*/
public void commit() throws SQLException
{
this.connect.commit();
}

/**
* Gibt ein PreparedStatement zu einem SQL-Statement zurueck.
*
* @param sqlString das SQL-Statement
* @return das PreparedStatement
*/
public PreparedStatement getPreparedStatement(String sqlString)
{
try {
return connect.prepareStatement(sqlString);
} catch (SQLException e) {
log.log(LogLevel.ERROR, e.toString(), this);
}

return null;
}

/**
* Schließt eine Datenbankconnection.
*/
public void close()
{
try
{
connect.close();

switch(dbEnum)
{
case LOGIN_DB:
loginDB = null;
break;
case KPTOOLS_DB:
kptoolsDB = null;
break;
case DATEI_IMP_DB:
datenImpDB = null;
break;
}
}
catch (SQLException e) {
log.log(LogLevel.ERROR, e.toString(), this);
}
}

/**
* Gibt zurueck ob beim setzen der Datenbankconnektion ein Fehler aufgetreten ist.
*
* @return funktionstuechtig oder nicht
*/
public boolean getKannStarten()
{
return kannStarten;
}

/**
* Setzt die Auto-Commit Variable der Datenbankconnektion
*
* @param autocom true = Auto-Commit
*/
public void setAutoCommit(boolean autocom)
{
try {
connect.setAutoCommit(autocom);
} catch (SQLException e) {
log.log(LogLevel.ERROR, e.toString(), this);
}
}
}

最佳答案

检查 MySQL 服务器中的错误日志。他们应该告诉你 MySQL 终止连接的原因。

我的猜测是数据库限制了事务的大小。简而言之:您试图一次插入太多数据。

如果是这种情况,请在每 1000 行后提交事务。

关于Java、MySQL 连接被输入数据终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25011825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com