我是Vaadin框架的新手,不确定如何进行数据库连接。
我不想在每个会话中都建立连接。不过,我的理解是,vaadin在会话级别起作用。
是否有可能创建一个无论会话如何持久化的类,然后vaadin会话都会查询该类以获取数据库连接?
您需要在应用程序服务器中使用jdbc连接池。
Vaadin只是一种用于创建应用程序UI层的技术,它与jdbc连接无关-您的服务层应注意业务逻辑实现,包括与数据库一起使用。这是Web应用程序的典型分层。据我对您的问题的理解,一种选择是将Spring用作后端-在管理各种类型的数据源和相关内容方面非常好。
使用Vaadin和获取数据库是正交的问题,彼此之间并不真正相关。
DataSource
接口通常最好为您的特定数据库定义DataSource
对象。
例如以DataSource
及其H2 Database Engine为例。
DataSource
implementation
然后,当您需要与数据库对话时,向该对象请求数据库连接。完成该数据库操作后,关闭连接。
DataSource
您可以简单地使用Java // Setup the data source.
JdbcDataSource ds = new JdbcDataSource();
ds.setURL("jdbc:h2:˜/test");
ds.setUser("sa");
ds.setPassword("sa");
return ds ; // Return as a `DataSource` object rather than concrete class.
语法。
Connection conn = myDataSource.getConnection() ;
某些人强烈建议使用try-with-resources。除了补救已证明的问题外,我个人不建议这样做,因为连接池很难正确地进行处理,并带来了其他问题,例如连接处于不良状态下返回到池中的连接(例如事务悬而未决)。如果您决定使用池,则try (
Connection conn = myDataSource.getConnection() ;
)
{
// Use `conn` object to work with database.
// When going out of scope here, the connection's `close` method is automatically called.
}
实现可以在后台处理池。
然后问题变成了存储connection pooling对象的位置。这是Vaadin进入照片的地方。
Vaadin基于DataSource
(以前称为Java Servlet)技术。实际上,Vaadin是一个很大的servlet。您的Vaadin网站在能够托管servlet的服务器上运行。该服务器需要支持DataSource
。该规范要求支持代表整个正在运行的Web应用程序的Jakarta Servlet对象(对于当前正在运行Web应用程序的每个用户,一个“上下文”具有零个,一个或多个“会话”对象)。
出于我们的目的而变得有趣的地方是Jakarta Servlet specification为您可能希望保留的所有对象提供缓存,以供应用程序的所有会话(用户)使用。此缓存称为“属性”,是键-值集合,其中键为ServletContext
。您可以将ServletContext
存储在此处,并以String
作为密钥。
那么,如何访问代表我们的Web应用程序的DataSource
对象?请参阅"javax.sql.DataSource"
以获取解释和可能更好的方法。
ServletContext
现在我们可以存储我们的this Question实现对象。我们可以使用任何ServletContext servletContext =
VaadinServletService // com.vaadin.flow.server.VaadinServletService
.getCurrentServletRequest() // Returns a javax.servlet.http.HttpServletRequest
.getServletContext() // Returns a `javax.servlet.ServletContext`.
;
,只要它在键值集合中是不同的即可。提示:为您的密钥字符串添加自己的域名以确保唯一性。
DataSource
并通过需要访问数据库的任何代码进行检索。键值集合将值存储为String
,因此必须进行强制转换。
servletContext.setAttribute( "com.example-javax.sql.DataSource" , dataSource ) ;
提示:您可能应该测试NULL结果。