【发布时间】:2017-02-06 15:37:52
【问题描述】:
我有一个基于 java 的 Web 应用程序,在其中插入一行到 aws MySQL 数据库中。
问题是,1-2 小时后,代码停止在数据库中插入行,并且在我的日志文件中没有出现任何错误。
表格结构如下:
现在当我调用 servlet 时,我正在使用这段代码。
JSONObject result=t_s.ro(jc.getT_conn(), t,true);
t 是 json 和 true/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,我通过 MySQL 工作台插入的后续查询的 ID 大约是 40,即如果我们假设剩余的 39 行没有被插入。
【问题讨论】:
-
如何添加
finally和conn.close(); -
我不想每次都关闭 conn。我在 servlet 启动时创建它,然后保持打开状态。
-
您是否检查了您的 MySQL 服务器以获取打开的连接数(可能已达到限制)...另外,您是否能够检查您的 rds 实例的负载?
-
max_connections {DBInstanceClassMemory/12582880} 1-100000 true system到目前为止,我只有 2 个连接处于活动状态。 -
我猜数据库连接已经打开太久,需要关闭并用新连接替换。我希望会抛出某种异常。您是否使用任何类型的连接池?听起来您只是在 servlet 初始化期间创建连接并坚持下去。您需要创建一个数据库连接池,并且您的代码每次需要一个连接时都应该从池中借用一个连接。连接池将完成验证连接是否仍然良好的工作。你在用Tomcat吗?
标签: java mysql amazon-web-services