【发布时间】:2013-10-17 20:10:44
【问题描述】:
我正在使用 Struts 2 开发一个 java web 应用程序。目前,在每个页面加载时,我都会建立一个新的数据库连接,然后在请求结束时关闭这个数据库连接,就在呈现结果 HTML 之前。因此,每个请求都有自己的数据库连接。
我想在我的模型类中包含一堆静态方法,例如 User.exists( id ) 这样的东西,如果给定的用户 ID 存在则返回 true,否则返回 false。或其他实用方法,如 User.getEmail(id) 或 User.disable(id)。
我的问题是,有没有一种方便的方法可以与这些静态方法共享数据库连接?必须将连接作为所有这些方法的第二个参数传递,例如 User.exists(id, db) 会很丑陋,而且不太方便。
如果我在这些实用方法中的每一个中获得一个新的数据库连接,并在返回结果之前关闭它会怎样?会不会对性能有影响?有时我可能需要在一个请求中调用这些方法 20-30 次(例如在验证用户输入时)。
【问题讨论】:
-
仅当您的数据库连接是完全线程安全的时,这是不太可能的。使用连接池。
-
@SLaks 我正在使用 struts 拦截器,它在每个页面请求开始时由 struts 调用。 db 连接是在拦截器的
intercept()方法中建立的,并且也在相同的方法中关闭,它知道请求已经完成渲染。所以我认为我在线程方面是安全的。我关心的是在每个静态实用程序方法中建立新的连接。这会影响性能吗? -
如果您使用的是 JEE 应用程序服务器,请使用它的连接池工具。然后你可以实现一个 OSIV 拦截器,如果使用 Spring/hibernate,它只需要一个动作来建立一个事务会话。事务会话只会在拦截器展开时关闭,但如果不需要数据库访问,则无需花费时间打开与数据库的实际连接。
-
标签: java mysql design-patterns struts2 connection-pooling