我有一个基于 java 的 Web 应用程序,正在其中在 aws MySQL 数据库中插入一行。
问题是,1-2 小时后,代码停止在数据库中插入行,并且我的日志文件中没有收到任何错误。
表格结构如下:
现在,当我调用 servlet 时,我使用这段代码。
JSONObject result=t_s.ro(jc.getT_conn(), t,true);
t
是 json
和 true/false
是根据我的情况的 boolean 值。
现在在 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,则我通过 MySQL 工作台插入的后续查询的 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()
即可。连接池将负责为您提供有效的连接。
如有错误请指正。
关于java - MySQL 插入查询突然无法在 aws rds 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42071588/