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

时间:2011-04-24 18:41:28

标签: java database jndi java-ee-5

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

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

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

1 个答案:

答案 0 :(得分:4)

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

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

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

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

因此,任何永久同步的共享缓存都是好的。

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

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

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

实施细节取决于您的偏好。我通常有一个按需执行查找的缓存,并且内部有一个jndi->对象的同步映射。对于高并发缓存,我使用读/写锁而不是天真同步 - 即许多读取可以并行,而添加新条目则获得独占访问。但这些细节很大程度上取决于应用程序的细节。