1 Star 3 Fork 1

凌康 / final-session

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
04.datesource.md 6.15 KB
一键复制 编辑 原始数据 按行查看 历史
凌康 提交于 2024-05-10 11:23 . doc

集群共享会话:session存储于数据库中

下面将演示session存储于mysql

依赖

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP -->
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>4.0.3</version>
</dependency>

创建表

CREATE TABLE `fs_session`
(
    `id`          varchar(64) NOT NULL,
    `session`     longblob,
    `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
    `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

表名是fs_session,开发中使用数据库不失是一种智慧!

处理类


import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import top.lingkang.finalsession.FinalSessionConfig;
import top.lingkang.finalsession.core.FinalRepository;
import top.lingkang.finalsession.jakarta.FinalSession;
import top.lingkang.finalsession.utils.SerializationUtils;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
 * 数据库存储session
 *
 * @author lingkang
 * Created by 2024/3/10
 */
public class FinalRepositoryDatasource implements FinalRepository<FinalSession> {

    private DataSource dataSource;

    @Override
    public void initProperties(FinalSessionConfig config) {
        // 配置数据库
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setJdbcUrl("jdbc:mysql://localhost:3306/test?useSSL=true");
        hikariConfig.setUsername("root");
        hikariConfig.setPassword("123456");
        hikariConfig.setMaximumPoolSize(20);
        dataSource = new HikariDataSource(hikariConfig);
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            ((HikariDataSource) dataSource).close();
        }));
    }

    @Override
    public FinalSession getSession(String id) {
        Connection connection = null;
        try {
            connection = dataSource.getConnection();
            PreparedStatement statement = connection.prepareStatement("select session from fs_session where id=?");
            statement.setObject(1, id);
            ResultSet resultSet = statement.executeQuery();
            if (resultSet.next()) {
                byte[] bytes = resultSet.getBytes(1);
                resultSet.close();
                return (FinalSession) SerializationUtils.unSerialization(bytes);
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if (connection != null && !connection.isClosed())
                    connection.close();
            } catch (Exception e) {
            }
        }
        return null;
    }

    @Override
    public void setSession(String id, FinalSession session) {
        Connection connection = null;
        try {
            connection = dataSource.getConnection();
            PreparedStatement statement = connection.prepareStatement("select count(*) from fs_session where id=?");
            statement.setObject(1, id);
            ResultSet resultSet = statement.executeQuery();
            boolean exists = false;
            if (resultSet.next()) {
                if (resultSet.getLong(1) > 0)
                    exists = true;
                resultSet.close();
            }
            if (exists) {
                // 存在就更新
                statement = connection.prepareStatement("update fs_session set session=? where id=?");
                statement.setObject(1, SerializationUtils.serialization(session));
                statement.setObject(2, id);
                statement.executeUpdate();
            } else {
                // 不存在就插入
                statement = connection.prepareStatement("insert into fs_session(id,session) values(?,?) ");
                statement.setObject(1, id);
                statement.setObject(2, SerializationUtils.serialization(session));
                statement.executeUpdate();
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if (connection != null && !connection.isClosed())
                    connection.close();
            } catch (Exception e) {
            }
        }
    }

    @Override
    public void deleteSession(String id) {
        Connection connection = null;
        try {
            connection = dataSource.getConnection();
            PreparedStatement statement = connection.prepareStatement("delete from fs_session where id=?");
            statement.setObject(1, id);
            statement.executeUpdate();
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if (connection != null && !connection.isClosed())
                    connection.close();
            } catch (Exception e) {
            }
        }
    }

    @Override
    public void destroy() {

    }
}

solon中请参考:https://gitee.com/lingkang_top/final-session/blob/master/final-session-test-solon/src/main/java/top/lingkang/finalsessionsolon/test02/FinalRepositoryDatasource.java

配置

import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import top.lingkang.finalsession.FinalSessionConfig;
import top.lingkang.finalsession.jakarta.FinalSessionFilter;

/**
 * @author lingkang
 * Created by 2024/3/10
 */
@Configuration
@Order(-1995)
public class MySessionConfigDatasource extends FinalSessionFilter {
    @Override
    protected void configurer(FinalSessionConfig config) {
        // 使用redis存储session
        config.setRepository(new FinalRepositoryDatasource());
    }
}

至此,您可以愉快地使用多节点集群共享session了

1
https://gitee.com/lingkang_top/final-session.git
git@gitee.com:lingkang_top/final-session.git
lingkang_top
final-session
final-session
master

搜索帮助