Tomcat 9.x までであれば、次の記事のような方法で対応することができました。
10.x 以降ではこれらの記事の設定だと動作しなくなっていたようなので、設定についてをメモとして。
DB ではありませんが、セッションを外部ストアに格納する方法については Redis と Apache TomcatのHttpSession連携 も参考になります。
9.x までは Class として、org.apache.catalina.session.JDBCStore を使用した記事が多いようですが、ドキュメントに記載されているようにこの Class は 10 で廃止されており、10 でこのクラスを利用しようとした場合は Class Not Found となるため、org.apache.catalina.session.DataSourceStore を使用する必要があります。
Deprecated.
Removed in Tomcat 10 and replaced by DataSourceStore with removal of legacy JDBC code
設定については Context.xml に Resource で、使用するデータソースを定義し、
<Context>
<Resource name="jdbc/PostgresDS" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="yourUsername" password="yourPassword" driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://localhost:5432/yourDatabase"/>
</Context>
Manager でセッションストアのテーブルの情報を指定すれば、対応することができます。
<Manager className="org.apache.catalina.session.PersistentManager"
saveOnRestart="true">
<Store className="org.apache.catalina.session.DataSourceStore"
dataSourceName="jdbc/PostgresDS"
sessionTable="tomcat_sessions"
sessionIdCol="session_id"
sessionDataCol="session_data"
sessionValidCol="session_valid"
sessionMaxInactiveCol="session_max_inactive"
sessionLastAccessedCol="session_last_accessed"/>
</Manager>
テーブルの定義については、Manager に記載されていますが、使用する RDBMS に応じたデータ型で、次のテーブルを作成することでセッション情報を DB に格納することができます。
create table tomcat_sessions ( session_id varchar(100) not null primary key, valid_session char(1) not null, max_inactive int not null, last_access bigint not null, app_name varchar(255), session_data mediumblob, KEY kapp_name(app_name) );
設定については JNDI Datasource How-To も参考になります。(以前のバージョンの情報となりますが Oracle Application Container Cloud Service: Create a Tomcat Cluster with MySQL Session Persistence も参考になります)
セッションを使用したアプリケーションについては Application Developer’s Guide の Example Application でセッションを使用するアプリケーションが含まれていますので、このアプリケーションでセッションのテストを行うことができます。