在我们的Grails项目中,我们使用一个通用的Groovy DAO访问带有PooledDataSource的Amazon Oracle数据库,但是事情没有用,我怀疑这是因为某些变量的范围不正确。我已经修改了代码并将名称更改为我们在多个位置执行的操作的一小部分。有些代码是由另一个开发人员编写的,他的Java经验比我更多 - 我是一个相对的Java / Groovy新手 - 请原谅基本问题。
class SomeDAO {
MyPooledDataSource ds = new MyPooledDataSource()
Connection conn
PreparedStatement stmt
String queryText
public String getUserCount() {
String jsonOne
PojoOne one = new PojoOne()
ds.setDataSource()
conn = ds.getPooled()
queryText = getQuery("SomeQuery")
try {
stmt = conn.prepareStatement(queryText)
stmt.setString(1, 'YTD')
stmt.setString(2, '2014')
ResultSet rs = stmt.executeQuery()
while (rs.next()) {
one.setUsers(rs.getString("USER_CT"))
one.setDropped(rs.getString("DROPPED_CT"))
}
} catch (SQLException e) {}
jsonOne = (one as JSON).toString()
return jsonOne
}
public String getUserMetrics() {
String jsonTwo
ArrayList objArray = new ArrayList()
ds.setDataSource()
conn = ds.getPooled()
try {
queryText = getQuery("SomeOtherQuery")
stmt = conn.prepareStatement(queryText)
stmt.setString(1, 'YTD')
stmt.setString(2, '2014')
ResultSet rsQuery = stmt.executeQuery()
while (rsQuery.next()) {
PojoTwo two = new PojoTwo()
two.setDisplay(rsQuery.getString("NAME"))
two.setDescription(rsQuery.getString("DESC"))
two.setValue(rsQuery.getString("AMT"))
objArray.add(two)
}
} catch (SQLException e) {}
jsonTwo = (objArray as JSON).toString()
return jsonTwo
}
public String getQuery(String operationName){
String query = "select QRY_TXT from T_SVC_QRY where OPERATION_NM = '" + operationName + "'"
ResultSet rs
ds.setDataSource()
conn = ds.getPooled()
stmt = conn.prepareStatement(query)
rs = stmt.executeQuery(query)
while (rs.next()) {
queryText = rs.getString("QRY_TXT")
}
return queryText
}
}
我对我们编写的代码有些担忧......
好像......
Connection conn
PreparedStatement stmt
String queryText
...不应该在Class级别,而是在每个方法中声明,以避免变量通过另一种方法(甚至是不同请求的相同方法)引起副作用。正确?请解释
PooledDataSource是否应在Class级别声明以供重用。正确?请解释
答案 0 :(得分:1)
那个时髦的代码。只应共享DataSource。使用您最喜欢的搜索引擎进行Google搜索groovy.sql.Sql - 在Groovy或Grails项目中直接使用JDBC是最好的选择。它有许多辅助方法,可以让你编写直观的代码并让它完成繁重的任务。
您可能需要先查看Javadoc page for the class。