我有一个使用单例数据库连接的Java EE struts Web应用程序。过去,只有一个weblogic服务器,但现在,集群中有两个weblogic服务器。
会话复制已经过测试,可以在此群集中运行。 Web应用程序包含一些链接,这些链接将打开不同的表单供用户填写。每个表单都有一个动态下拉列表,根据单击的表单填充一些值。这些下拉列表值是从oracle数据库中检索的。
一个独特的问题是,单击的第一个表单可能需要大约2-5秒,而单击的第二个表单可能需要永久加载或超过5分钟。我已经检查了代码并且碰巧知道问题在于尝试调用db连接的一个实例时。这可能是一个僵局吗?
public static synchronized DataSingleton getDataSingleton()
throws ApplicationException {
if (myDataSingleton == null) {
myDataSingleton = new DataSingleton();
}
return myDataSingleton;
}
任何帮助解释这种情况都将不胜感激。
谢谢
A sample read operation calling Singleton
String sql = "...";
DataSingleton myDataSingleton = DataSingleton.getDataSingleton();
conn = myDataSingleton.getConnection();
try {
PreparedStatement pstmt = conn.prepareStatement(sql);
try {
pstmt.setString(1, userId);
ResultSet rs = pstmt.executeQuery();
try {
while (rs.next()) {
String group = rs.getString("mygroup");
}
} catch (SQLException rsEx) {
throw rsEx;
} finally {
rs.close();
}
} catch (SQLException psEx) {
throw psEx;
} finally {
pstmt.close();
}
} catch (SQLException connEx) {
throw connEx;
} finally {
conn.close();
}
The Singleton class
/**
* Private Constructor looking up for Server's Datasource through JNDI
*/
private DataSingleton() throws ApplicationException {
try {
Context ctx = new InitialContext();
SystemConstant mySystemConstant = SystemConstant
.getSystemConstant();
String fullJndiPath = mySystemConstant.getFullJndiPath();
ds = (DataSource) ctx.lookup(fullJndiPath);
} catch (NamingException ne) {
throw new ApplicationException(ne);
}
}
/**
* Singleton: To obtain only 1 instance throughout the system
*
* @return DataSingleton
*/
public static synchronized DataSingleton getDataSingleton()
throws ApplicationException {
if (myDataSingleton == null) {
myDataSingleton = new DataSingleton();
}
return myDataSingleton;
}
/**
* Fetching SQL Connection through Datasource
*
*/
public Connection getConnection() throws ApplicationException {
Connection conn = null;
try {
if (ds == null) {
}
conn = ds.getConnection();
} catch (SQLException sqlE) {
throw new ApplicationException(sqlE);
}
return conn;
}
答案 0 :(得分:0)
听起来您在使用连接时可能不会提交交易。
DataSingleton中有什么 - 它是数据库连接吗?允许多个线程访问同一个数据库连接是行不通的,例如,如果您有多个用户。为什么不使用数据库连接池,例如DataSource?