在过去的几天里,在我将最新版本的软件上传到我们的服务器后,我们的一个应用程序开始出现故障。它访问一些共享表,但我无法弄清楚我是否做错了什么以及是否是我的错。
在我的测试环境中,一切正常,但在我更新主服务器上的表期间,我发现其中一些表似乎已被锁定,就像仍有待处理的操作一样。
在活动监视器中杀死我的进程后,一切都很好了。这有点奇怪。我使用普通的 JDBC,有时还使用 Hibernate 进行操作。我检查了几次,我总是这样处理 JDBC-Connections:
Connection c = null;
Statement s = null;//Sometimes PreparedStatement
ResultSet rs = null;
try{
//OPERATIONS
}
catch{
//Handling
}finally{
Mycon.disconnect(rs,ps,c);
}
Mycon-Class 是一个静态类,它只支持这些基本的东西......
public static void disconnect(ResultSet resultSet, PreparedStatement ps, Connection connection) {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
} // nothing we can do
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
} // nothing we can do
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
} // nothing we can do
}
}
对于 Hibernate,它通常更容易。然后我只使用一个简单的:
try{
SessionFactory factory = HibernateUtil.getSessionFactory();
Session hsession = factory.openSession();
Transaction tx = hsession.beginTransaction();
//Operations
tx.commit;
}catch(...){}
finally{
try{
hsession.close;
}catch(...){}
}
我使用 Apache Tomcat 7 来处理我的连接,所以我认为没有必要担心连接。
无论如何-例如我的4个过程:
第一个和第二个只是来自服务器管理器。
3 详细说明:
SELECT W_ID, Comment, Date FROM Buran.dbo.Object WHERE right(convert(varchar, Date, 106), 8) like ''
在我看来,这不应该存在。我多次使用这个语句和另一个语句但关闭它:
innerstat = null;
inners = null;
innerswert = "";
try {
innerstat = c.createStatement();
inners = innerstat.executeQuery("SELECT W_ID, Comment, Date FROM Buran.dbo.Object WHERE right(convert(varchar, Date, 106), 8) like '" + innerswert + "'");
while (inners.next()) {
innerswert = inners.getString(1);
out.write("<option value='" + inners.getInt("W_ID") + "'>");
out.write(innerswert);
out.write("</option>");
}
} catch (SQLException sqle2) {
out.write(sqle2.toString());
out.write(sqle2.getLocalizedMessage());
sqle2.printStackTrace();
} finally {
Mycon.disconnect(inners, innerstat);
}
我只是在解释不存在的东西吗?服务器日志很好,我的代码可以正常工作而不会引发异常。你认为可能是什么错误(如果有的话?)