繁体   English   中英

MySQL插入查询突然无法在aws rds中工作

[英]MySQL insert query not working in aws rds abruptly

我有一个基于Java的Web应用程序,正在其中将一行插入到AWS MySQL数据库中。

问题是,在1-2个小时后,代码停止在数据库中插入行,并且在我的日志文件中没有出现任何错误。

该表的结构如下:

在此处输入图片说明

现在,当调用servlet时,正在使用这段代码。

JSONObject result=t_s.ro(jc.getT_conn(), t,true); 

根据我的情况, tjsontrue/false是一个布尔值。

现在在jc.getT_conn()内部正在使用以下代码:

public static Connection getT_conn() throws ClassNotFoundException, JSONException {
        Connection c=null;
        if(t_conn==null)
        {
            c=rds_conn();
        }
        else
        {
            c=t_conn;
        }
        return c;
    }

这里t_conn是该java文件的全局变量,并且rds_conn()创建它后会返回一个新连接。

现在从t_s.ro类中调用一个函数,如果满足,该函数将根据条件将行插入数据库。

这是代码:

public static boolean dPOI(Connection conn,String d,String u,ArrayList<String> l,ArrayList<String> li) throws SQLException
        {
            long startTime=System.currentTimeMillis();
            System.out.println("Time for sql start is : "+System.currentTimeMillis());
            PreparedStatement stmt = null;
            boolean action=false;
            try {
                String sql="INSERT INTO `ce`.`cse`(`twsD`,`twsID`,`twsi`)VALUES(?,?,?)";
                stmt = conn.prepareStatement(sql);
                stmt.setString(1, u);
                stmt.setString(2, d);
                stmt.setString(3, l.toString()+"~"+li.toString());
                System.out.println(stmt.toString());
                action = stmt.execute();
                //conn.close();
            } catch (SQLException e) {
                //  handle sql exception
                System.out.println("SQL Exception");
                e.printStackTrace();
            }catch (Exception e) {
                // TODO: handle exception for class.forName
                System.out.println("Exception");
                e.printStackTrace();
            }

            stmt.close();
            long endTime=System.currentTimeMillis();
            System.out.println("Time taken inside sql Query is : "+(endTime-startTime));
            return action;
        }

以下是正在获取的日志文件。

Time for sql start is : 1486393105661

com.mysql.jdbc.JDBC42PreparedStatement@59037dda: INSERT INTO `ce`.`cse`(`twsD`,`twsID`,`twsi`)VALUES('Bana','2fdb0c926765','[\'FOM\', \'MONEY CENTER KOLA - BAORE\']~[83.80, 272.20]')

Time taken inside sql Query is : 1

现在,如果可以看到,我没有收到任何SQL异常或任何其他类型的异常。 而且,花费的时间始终为1(停止插入时),否则为20-25。

此外,您的自动增量ID总是用完,我的意思是,如果最后一行是在ID 1处插入的,则我通过My​​SQL工作台插入的后续查询的ID大约在40左右,即假设39其余行未插入。

以Mark B的评论为起点,我决定创建一个将提供连接的连接池。

下面是我使用的代码:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.commons.dbcp2.BasicDataSource;
public final class Database {
    private static final String SQL_EXIST = "show tables;";
    public static void main(String[] args) throws SQLException {
        // TODO Auto-generated method stub
        boolean exist = false;

        try (
            Connection connection = Database.getConnection();
            PreparedStatement statement = connection.prepareStatement(SQL_EXIST);
        )
        {


            try (ResultSet resultSet = statement.executeQuery()) {
                exist = resultSet.next();
            }
        }       

        System.out.println("Value is : "+ exist);
    }

    private static final BasicDataSource dataSource = new BasicDataSource();

    static {
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("CONNECTION_STRING");
        dataSource.setUsername("USERNAME");
        dataSource.setPassword("PASSWORD");
        dataSource.setMaxTotal(100);
    }

    private Database() {
        //
    }

    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
}

第一个功能仅用于测试目的。

现在,在创建此Database类之后,只要需要获取连接就调用Database.getConnection() 连接池将为您提供有效的连接。

如果错了,请纠正我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM