Vaadin和数据库连接池

问题描述 投票:-1回答:3

我是Vaadin框架的新手,不确定如何进行数据库连接。

我不想在每个会话中都建立连接。不过,我的理解是,vaadin在会话级别起作用。

是否有可能创建一个无论会话如何持久化的类,然后vaadin会话都会查询该类以获取数据库连接?

connection connection-pooling vaadin
3个回答
0
投票

您需要在应用程序服务器中使用jdbc连接池。


1
投票

Vaadin只是一种用于创建应用程序UI层的技术,它与jdbc连接无关-您的服务层应注意业务逻辑实现,包括与数据库一起使用。这是Web应用程序的典型分层。据我对您的问题的理解,一种选择是将Spring用作后端-在管理各种类型的数据源和相关内容方面非常好。


0
投票

使用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结果。

© www.soinside.com 2019 - 2024. All rights reserved.