嵌入式jetty的JDBC会话(9.4以上版本)



我正在尝试为嵌入式jetty服务器实现jdbc会话,以便在openshift环境中跨节点共享会话(以避免用户在部署时丢失会话(。现有官方文件(https://www.eclipse.org/jetty/documentation/9.4.32.v20200930/configuring-sessions-jdbc.html)只有Jetty分发实现的实现详细信息。在How to setup embedded Jetty to use JDBC sessions 中有一个类似但不完整的解决方案

// Configure a JDBCSessionDataStoreFactory.
JDBCSessionDataStoreFactory sessionDataStoreFactory = new JDBCSessionDataStoreFactory();
sessionDataStoreFactory.setGracePeriodSec(3600);
sessionDataStoreFactory.setSavePeriodSec(0);
sessionDataStoreFactory.setDatabaseAdaptor(...);
JDBCSessionDataStore.SessionTableSchema schema = new JDBCSessionDataStore.SessionTableSchema();
schema.setAccessTimeColumn("accessTime");
schema.setContextPathColumn("contextPath");
// ... more configuration here
sessionDataStoreFactory.setSessionTableSchema(schema);
// Add the SessionDataStoreFactory as a bean on the server.
server.addBean(sessionDataStoreFactory);

这里还不清楚如何创建DatabaseAdaptor对象。有人能帮忙吗?

创建DatabaseAdaptor非常容易。这里有一个例子:

DatabaseAdaptor driverAdaptor = new DatabaseAdaptor();
driverAdaptor.setDriverInfo("com.mysql.jdbc.Driver",
"jdbc:mysql://127.0.0.1:3306/sessions?user=sessionsadmin");

这就是使用驱动程序类创建一个驱动程序所要做的全部工作。还有其他选项可以传递一个javax.sql.DataSource,或者一个jndi字符串来查找以获得javax.sql.DataSource。但是使用驱动程序类和jdbc字符串是非常常见的。

您实际上不必在DatabaseAdapter上设置任何其他内容,因为它试图从数据库之间发生变化的连接返回的元数据中计算出它需要什么。数据库之间发生变化的一些例子是一些sql类型的名称,如字符串、long和Blob。例如,对于Oracle,long是number(20),但对于其他数据库,它是bigint。在DatabaseAdapter无法解决的情况下,您可能需要明确地告诉它这些类型名称是什么,但在大多数情况下,DatabaseAdapter能够解决它。

最新更新