Java Program Speed数据库连接

时间:2013-09-17 08:28:38

标签: java database performance derby

我已经完成了第一个访问数据库的java程序,并允许我远程访问机器。

当我从我自己的机器(它还托管它连接的数据库)运行它时,这工作正常。但是,如果我在另一台机器上使用它并连接到数据库,程序在执行数据库任务时会大大挂起。

我预计这是一个小小的等待,但有时它可能需要几分钟才能完成手头的任务。

下面是其中的一项任务。

    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();
}

这都是德比数据库。

我做错了什么?我错过了什么?有没有办法我可以对此运行某种性能检查,以找出在运行数据库任务时究竟导致它挂起的原因,因为这是内部网络上的内部网络,我不希望等待多少我是!

编辑:在Stefan的帮助下(感谢一堆)香港专业教育学院发现使用断点似乎在运行该线后挂起

conn = dataSource.getConnection(); 

之后的下一行现在是

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

但它只在运行Connection行后挂起,这是否意味着与物理数据库的连接导致挂起?

Edit2:我现在已经设置了一个连接池,但是在连接时它仍然悬空,我现在有点不知所措!,不同的引擎会提供更好的结果吗?

2 个答案:

答案 0 :(得分:1)

经过一番搜索(你的结论是创建连接本身就是性能问题),我找到了this。连接池比自己设置连接更有效。它也更容易使用,因为您不必自己管理连接。请记住,在完成后关闭连接,因此可以将其返回池中以备将来使用。

答案 1 :(得分:0)

声明上使用 PreparedStatement 可以提高性能。 关于PreparedStatement的一些细节

PreparedStatement 是java.sql包中的一个类,允许Java程序员使用JDBC包执行SQL查询。您可以通过调用connection.prepareStatement()方法获取PreparedStatement对象。如果JDBC驱动程序支持,则传递给此方法的SQL查询将转到Database进行预编译。如果它不是在执行准备好的查询时发生预编译。 Prepared Statement查询是在数据库上预编译的,并且将重用访问计划来执行进一步的查询,这使得它们比Statement对象生成的常规查询执行得快得多。

如何使用 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"));
        }       
    }
}