ここ数日、ソフトウェアの最新バージョンをサーバーにアップロードした後、アプリケーションの 1 つが失敗し始めました。いくつかの共有テーブルにアクセスしますが、何か間違ったことをしているのか、それが私のせいなのかどうかを判断できません。
私のテスト環境ではすべてうまくいきましたが、メイン サーバーでテーブルを更新しているときに、操作がまだ保留中の場合のように、テーブルの一部がロックされているように見えることに気付きました。
アクティビティモニターでプロセスを強制終了した後、すべてが再び正常になりました。これは少し奇妙でした。私はプレーンな JDBC を使用しており、時には Hibernate を操作に使用しています。何度か確認しましたが、常に次のように JDBC 接続を処理します。
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つのプロセスがあります:
1 つ目と 2 つ目は、Server-Manager からのものです。
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);
}
そこにないものを解釈しているだけですか?サーバーログは問題なく、私のコードは例外をスローすることなく正常に動作します。何が間違いだと思いますか(もしあれば?)