-1

データベースにアクセスし、マシンにリモート接続できるようにする最初の Java プログラムを書き終えました。

これは、自分のマシン (接続先のデータベースもホストしている) から実行すると問題なく動作します。ただし、別のマシンで使用してデータベースに接続すると、データベース タスクの実行中にプログラムがかなりハングします。

少し待つと思っていましたが、目の前のタスクが完了するまでに数分かかる場合があります。

これがハングアップするタスクの 1 つです。

    public void ChangeSite() throws Exception{

    ConnectionPoolS demo = new ConnectionPoolS();
    DataSource dataSource = demo.setUp();

    Connection conn = null;
    PreparedStatement stmt = null;



    String Site = (String)Sites.getSelectedItem();
    jProgressBar.setIndeterminate(true);
    jProgressBar.setStringPainted(true);
    jProgressBar.setString("Searching...");
    int sRecordNo; 
     sRecordNo = 0;
String IpAddress = null, IpRange = null, Atvisionpw = null, Port = null, Practice = null, Surgery = null;
try { 


    conn = dataSource.getConnection();
    stmt = conn.prepareStatement("SELECT * FROM Customer WHERE Practice = '"+Site+"' and BRANCH = 'N'");
    ResultSet rs = stmt.executeQuery( );

    while (rs.next()) {
    sRecordNo = sRecordNo + 1;
    Surgery = rs.getString("SURGERY");
    Practice = rs.getString("PRACTICE");
    IpAddress = rs.getString("IPADDRESS");
    Port = rs.getString("PORT");
    Atvisionpw = rs.getString("ATVISIONPW");
    IpRange = rs.getString("IPRANGE");
}
    if (sRecordNo == 1){
    SiteIp.setText(IpAddress);
    Password.setText(Atvisionpw);
    PcIp.setText(IpRange);
    }
    else if (sRecordNo > 1){
       Multisite();
    }
    jProgressBar.setIndeterminate(false);
    jProgressBar.setString("");
stmt.close();
conn.close();
}

これはすべて derby データベースにあります。

私が間違っていることは何ですか?何か不足していますか?これについて何らかのパフォーマンスチェックを実行して、データベースタスクの実行中にハングする原因を正確に突き止める方法はありますか?私は!

編集:Stefanの助けを借りて(ありがとうございました)、ブレークポイントを使用すると、行を実行した後にハングしているように見えることがわかりました

conn = dataSource.getConnection(); 

その後の次の行は今

stmt = conn.prepareStatement("SELECT * FROM Customer WHERE Practice = '"+Site+"' and BRANCH = 'N'");

ただし、接続行を実行した後にのみハングするので、これは物理データベースへの接続がハングの原因であることを意味しますか?

Edit2:接続プールを設定しましたが、接続時にまだハングしています。今は少し途方に暮れています!別のエンジンを使用すると、より良い結果が得られますか?

4

2 に答える 2

1

いくつか検索した後 (そして、接続の作成自体がパフォーマンスを浪費するというあなたの結論)、私はこれを見つけまし。接続プーリングは、自分で接続を設定するよりもはるかにパフォーマンスが高くなります。自分で接続を管理する必要がないため、作業も簡単です。完了したら接続を閉じることに注意してください。そうすれば、後で使用するためにプールに戻すことができます。

于 2013-09-17T09:27:57.453 に答える
0

use of PreparedStatement over statement may improve performance up to little bit. some details about PreparedStatement

PreparedStatement is a class in java.sql package and allows Java programmer to execute SQL queries by using JDBC package. You can get PreparedStatement object by calling connection.prepareStatement() method.SQL queries passed to this method goes to Database for pre-compilation if JDBC driver supports it. If it doesn't than pre-compilation occurs when you execute prepared queries. Prepared Statement queries are pre-compiled on database and there access plan will be reused to execute further queries which allows them to execute much quicker than normal queries generated by Statement object.

How to use PreparedStatement

public class PreparedStmtExample {

    public static void main(String args[]) throws SQLException {
Class.forName("com.mysql.jdbc.Driver");
        Connection conn =     DriverManager.getConnection("jdbc:mysql://localhost:3306/DataBase","username","Password");
        PreparedStatement preStatement = conn.prepareStatement("select *  from tableName where Name=?");
        preStatement.setString(1, "test");

        ResultSet result = preStatement.executeQuery();

        while(result.next()){
            System.out.println("Loan Type: " + result.getString("loan_type"));
        }       
    }
}
于 2013-09-17T08:34:14.930 に答える