我正在开展一个项目,我们将GAE与Google Cloud SQL结合使用。我已经按照本教程https://developers.google.com/appengine/docs/java/cloud-sql/developers-guide#use_with_lang来学习如何连接到数据库,到目前为止除了驱动程序注册部分之外一切正常。我的直觉告诉我,驱动程序应该只注册一次,但我不知道何时何地是最好的地方。 gae中是否有一种初始化功能可以在实例启动时执行某些代码?或者可能是一个可以加载资源的xml文件?
到目前为止,我的代码看起来像这样:
try {
// Connect to the db.
DriverManager.registerDriver(new AppEngineDriver());
Connection c = DriverManager.getConnection(JDBC_CON_STRING);
// Fetch rows
String sql = "SELECT * FROM test";
ResultSet rs = c.createStatement().executeQuery(sql);
ArrayList<BaseUser> users = new ArrayList<BaseUser>();
while(rs.next()){
BaseUser u = new BaseUser();
u.setFirstname(rs.getString("firstname"));
u.setLastname(rs.getString("lastname"));
users.add(u);
}
rs.close();
c.close();
// Print the users in the console.
for (BaseUser user : users) {
logger.info("Firstname: " + user.getFirstname() + ", Lastname: " + user.getLastname());
}
} catch (SQLException e) {
e.printStackTrace();
}
我想摆脱第一行,把它放在只执行一次的地方然后,每当我收到一个需要sql事务的请求时,我只需要调用DriverManager.getConnection(... )
谢谢你, 罗德里戈。
答案 0 :(得分:3)
所以我终于在google的doc中找到了一种“在调用任何servlet之前运行自定义逻辑”的更好方法。这是:只需在web.xml中注册一个ServletContextListener,并覆盖contextInitialized方法,在我的例子中,是自定义驱动程序注册。
这是web.xml代码:
<web-app>
...
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<listener>
<listener-class>com.my.project.ClassName</listener-class>
</listener>
</web-app>
contextInitializeMethod:
@Override
public void contextInitialized(ServletContextEvent arg) {
try {
DriverManager.registerDriver(new AppEngineDriver());
} catch (SQLException e) {
e.printStackTrace();
}
}
以下是指向实际Google指南的链接:https://developers.google.com/appengine/docs/java/config/appconfig#Using_a_ServletContextListener
希望对有类似问题的人有所帮助。