java - 在 Java EE 中缓存 DataSource 查找是否安全?

标签 java database jndi java-ee-5

我正在开发一个简单的 Java EE 5“路由”应用程序。一个MQ队列中的不同消息先进行转换,然后根据某个字段的值存储到不同的数据源中(需要调用不同ds中的存储过程)。

例如 valueX -> dataSource1,valueY -> dataSource2。所有数据源都在具有不同 jndi 条目的应用程序服务器中设置。由于路由信息在应用程序运行时通常不会更改,是否保存以缓存数据源查找?例如,我将实现一个单例,它包含一个 HashMap ,我在其中存储 valueX->DataSource1。当某个条目不在列表中时,我会进行资源查找并将结果存储在 map 中。我是否通过缓存获得了任何性能,或者这些资源查找是否足够快?

一般来说,构建这种缓存的最佳方法是什么?我也可以将缓存用于其他一些数据库查找。例如,映射值 X -> 资源名称是在数据库中的一个简单表中定义的。按需查找值并将结果保存在 map 中,一直查找甚至在启动时读取并保存所有条目是否更好?我需要同步访问吗?我可以只创建一个“枚举”单例实现吗?

最佳答案

从操作/变更管理的角度来看是安全的,但从程序员的角度来看并不安全。

从程序员的 PoV 来看,DataSource 配置可以在运行时更改,因此应该始终重复查找。

但这并不是现实生活中发生的事情。

当要实现对数据源的更改时,这是通过更改管理程序完成的。有一个 c/r 记录,该记录表明应用程序将停机。换句话说,执行 c/r 的操作人员将关闭应用程序,进行更改并将其重新启动。出于安全原因,没有人会在实时 AS 上进行这样的更改。因此,您不应考虑 DS 在运行时发生变化的可能性。

所以在这种情况下任何永久同步共享缓存都是好的。

你会得到性能提升吗?这取决于 AS 实现。它可能有自己的缓存,但该缓存可能更通用且更慢,实际上您根本不能指望它的存在。

是否需要建立缓存?答案通常来自性能测试。如果没有问题,为什么要浪费时间和引入风险?

简历:是的,构建一个简单的缓存并使用它——如果性能提升是合理的。

具体实现取决于您的偏好。我通常有一个按需查找的缓存,里面有一个同步的 jndi->object 映射。对于高并发缓存,我会使用读/写锁而不是简单的同步——即许多读取可以并行进行,同时添加一个新条目获得独占访问。但这些细节在很大程度上取决于应用程序的细节。

关于java - 在 Java EE 中缓存 DataSource 查找是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5772460/

相关文章:

java - 嵌套 for 循环整数比较 - 意外索引

java - 无法从接口(interface)实例化类

java - 如何在类编译后运行java程序

database - 是否可以在 Amazon EC2+EBS 上运行大型 Oracle 数据库 (7TB)?

java - JayDeBeApi 连接崩溃

java - 使用 IntelliJ 部署到远程 Tomcat 实例的 Web 应用程序找不到 JNDI 资源(javax.naming.NameNotFoundException)

java - 通过注解设置与 Spring 的 JNDI 连接

java - 解锁锁定的 Activity 目录帐户

Java 原生启动器性能

json - 如何使用aerospike查询语言导入json数据?