我有一个使用 Javalin(Java 中的简单 HTTP 框架)构建的应用程序,它利用 Cassandra 作为后端。
根据 Datastax 文档https://docs.datastax.com/en/developer/java-driver/4.9/manual/core/#quick-start
CqlSession 是驱动程序的主要入口点。它拥有实际 Cassandra 集群的已知状态,是您用来执行查询的工具。它是线程安全的,您应该创建一个实例(每个目标 Cassandra 集群),并在整个应用程序中共享它;
这就是我的main
函数的样子:
public static void main(String[] args) {
CqlSession cqlSession = CqlSession.builder().build();
runCassandraMigration(cqlSession);
Javalin app =
Javalin.create(config -> config.registerPlugin(new OpenApiPlugin(getOpenApiOptions())))
.start(PORT);
Handlers handlers = new Handlers(cqlSession);
registerAppRoutes(app, handlers);
}
该类Handlers
包括句柄函数,如下所示:
public class Handlers {
private final CqlSession session;
public Context getAllUsers(Context ctx) {
ResultSet rs = session.execute("select * from my_status.users");
List<Row> rows = rs.all();
return ctx.json(rows.stream().map(this::rowToUser).collect(Collectors.toList()));
}
}
但是,在我启动应用程序并在本地点击 REST 端点后,我得到了
java.lang.IllegalStateException: Session is closed
我想知道如何创建一个长期的CqlSession
而不是每个请求的短期的。我正在开发的应用程序可以在https://github.com/YikSanChan/mystatus/tree/main/api/src/main/java中找到。