我有一个基于客户端服务器的java应用程序。服务器处理来自客户端的所有请求并作出响应。我已经创建了一种在服务器上查询客户帐户的方法,但是有时候服务器返回的帐户信息与客户端请求的帐户无关。经过几次搜索,我发现它可能是线程问题所以我决定在解决该问题的方法上添加同步关键字,但我的问题是应用程序已经放慢速度,这是我的代码。
public synchronized List<String> queryCustomer(int AccountNumber) {
List<String> acntinfor = new ArrayList();
ResultSet rs = null;
PreparedStatement pmst = null;
Connection conn = getConnection();
try {
pmst = conn.prepareStatement("Select name,balance from tblaccount where Ac_number=?");
pmst.setInt(1, AccountNumber);
rs = pmst.executeQuery();
if (rs.next()) {
acntinfor.add(rs.getString("name"));
acntinfor.add(rs.getString("balance"));
}
rs.close();
pmst.close();
} catch (Exception e) {
e.printStackTrace();
}
return acntinfor;
}
public Connection getConnection() {
// db is class that has connection to my db
DB b = DB.getDB();
return b.getConnetion();
}
如何提高应用程序的速度?
答案 0 :(得分:5)
同步会创建内存屏障并强制执行先发生关系以确保数据一致性。所有这些都是以牺牲性能为代价的。应使用同步来获得一致的数据。如果您的应用程序需要它,那么您应该使用它。
您可以做的是减少关键部分。即,只同步可能导致问题的那部分代码。
注意:自java 6更新23以来,引入了 Escape Analysis 来查找不必要地使用同步的代码部分(以及许多其他内容)。因此,JVM可能只是优化您的代码(如果引用没有转义/如果多个线程不访问同步块,那么监视器将不会被锁定..)