java - 语句关闭后不允许进行任何操作。 Java, MySQL

标签 java mysql

我有这个代码:

public void saveGPSReading(GPSReader gpsRd){

String sql="INSERT INTO EventData(" +
        "accountID," +
        "deviceID," +
        "timestamp,"+
        "statusCode," +
        "latitude," +
        "longitude, " +
        "gpsAge," +
        "speedKPH, " +
        "heading," +
        "altitude," +
        "address," +
        "creationTime)" +
        "values(" +
        "'demo','teltonika001',?,61714,?,?,0,?,?,?,'--not implemented--',?)";

    try{
        if(!con.isClosed()){

            stmt = con.prepareStatement(sql);

            for(DeviceEvent de : gpsRd.getEvents()){
                GPSElement gps=de.getGpsElement();
                IOElementReader ioe= de.getIoElement();

                stmt.setLong(1, gps.getTimestamp().getTime());
                stmt.setDouble(2, gps.getLatitude());
                stmt.setDouble(3, gps.getLongitude());
                stmt.setLong(4, gps.getSpeed());
                stmt.setLong(5, gps.getAngle());
                stmt.setLong(6, gps.getAltitude());
                stmt.setLong(7, (new Date()).getTime());

                stmt.addBatch();
                //String s = stmt.toString();
            }
            stmt.executeBatch();
        }
    }
    catch(Exception err){
        err.printStackTrace();
    }
}

在这里调用:

public void readPacketData(){
    if(info.isValid()==true){
        for( int i =0; i< info.getRecords(); i++){
            GPSElement gps= readGPSElement();

            IOElementReader io= readIOElement();
            DeviceEvent dEvt = new DeviceEvent(gps,io);
            gpsReader.addEvent(dEvt);
        }
    }
    dbMan.saveGPSReading(gpsReader);

那是我调用它的唯一地方,并且在该行遇到异常

stmt.executeBatch();

java.sql.BatchUpdateException: No operations allowed after statement closed. at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:2024) at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1449) at DBManager.saveGPSReading(DBManager.java:64)

这里有什么帮助吗?

我不会在这里关闭任何东西。甚至连连接都没有,在我的代码中的任何一点

::编辑::

所以我按照你的提示,将代码更改为:

public void saveGPSReading(GPSReader gpsRd){

    String sql="INSERT INTO EventData(" +
        "accountID," +
        "deviceID," +
        "timestamp,"+
        "statusCode," +
        "latitude," +
        "longitude, " +
        "gpsAge," +
        "speedKPH, " +
        "heading," +
        "altitude," +
        "address," +
        "creationTime)" +
        "values(" +
        "'demo','teltonika001',?,61714,?,?,0,?,?,?,'--not implemented--',?)";       
    try{
        Connection con= createConnection();
        con.setAutoCommit(false);
        stmt = con.prepareStatement(sql);                   
        for(DeviceEvent de : gpsRd.getEvents()){
            GPSElement gps=de.getGpsElement();
            IOElementReader ioe= de.getIoElement();

            stmt.setLong(1, gps.getTimestamp().getTime());
            stmt.setDouble(2, gps.getLatitude());
            stmt.setDouble(3, gps.getLongitude());
            stmt.setLong(4, gps.getSpeed());
            stmt.setLong(5, gps.getAngle());
            stmt.setLong(6, gps.getAltitude());
            stmt.setLong(7, (new Date()).getTime());

            stmt.addBatch();
        }
        int[] updateCounts = stmt.executeBatch();
        checkUpdateCounts(updateCounts);
        con.commit();
    }
    catch (BatchUpdateException e) {
        int[] updateCounts = e.getUpdateCounts();
        checkUpdateCounts(updateCounts);
        try {
            con.rollback();
        } 
        catch (Exception e2) {
            e.printStackTrace();
        }
    } 
    catch (Exception e) {
        e.printStackTrace();
    } 
    finally {
        try {
            stmt.close();
            con.close();
        } 
        catch (SQLException e) {
            e.printStackTrace();
        }         
    }
}

使用新方法创建连接:

public Connection createConnection(){
    Connection con= null;
    if(con ==null){
        try {
            DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 
            String c=Constants.DB.DB_URL+"?user="+Constants.DB.DB_USER+"&"+"password="+Constants.DB.DB_PASSWORD;
            con=DriverManager.getConnection(c);
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
    }
    return con;
}

同样的问题仍然存在

最佳答案

anfy2002us 已经在他的评论中发布了您的数据库连接可能尚未打开(因为 isClosed 只有在打开然后关闭时才为真)。

如果这不是这里的问题(例如,如果您真的在输入 readPacketData() 之前检查连接是否已打开,那么请按照本例进行操作:

http://www.java2s.com/Code/Java/Database-SQL-JDBC/DemoPreparedStatementAddBatchMySQL.htm

我们应该明确地处理批处理失败和失败时的回滚重试。

关于java - 语句关闭后不允许进行任何操作。 Java, MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6858455/

相关文章:

MySQLd : Can't change dir to '/var/lib/mysql/' (Errcode: 13 - Permission denied)

mysql - 通过 URL 将 Laravel 连接到 Heroku 数据库

mysql - 如何使用sql获取最大重复次数

java - Webview 中的进度条

java - 无法读取 BroadcastReceiver 中的最后一条短信

java - 父类(super class)的隐藏方法

java - 匿名内部类在访问其原语等时是否总是捕获对 "this"(外部)对象的引用?

java - 获取 Java 打印机图形设备

php - 逗号分隔的字符串作为字段和数据 - 在 php mysql 中更新查询

php - 如何根据用户使用 SQL 获得的积分数量找到用户的排行榜位置?