我已经完成了第一个访问数据库的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:我现在已经设置了一个连接池,但是在连接时它仍然悬空,我现在有点不知所措!,不同的引擎会提供更好的结果吗?
答案 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"));
}
}
}