制作静态数据源
Making a static datasource
我对这个话题做了足够的研究,但还没有找到具体的答案。以下是代码片段,
private static Map<String,DataSource> dataSourceMap;
static {
Map<String,DataSource> jndiContextDataSourceMap = new HashMap<>();
try {
jndiContextDataSourceMap.put(JNDI_DEFAULT_DATASOURCE, (DataSource) new InitialContext().lookup(JNDI_DEFAULT_DATASOURCE));
} catch (NamingException namingException) {
logger.error("Unable to obtain default DataSource through JNDI Lookup.", namingException);
}
try {
jndiContextDataSourceMap.put(JNDI_READ_REPLICA, (DataSource) new InitialContext().lookup(JNDI_READ_REPLICA));
} catch (NamingException namingException) {
logger.error("Unable to obtain read only DataSource through JNDI Lookup.", namingException);
}
dataSourceMap = Collections.unmodifiableMap(jndiContextDataSourceMap);
}
可以使用相同的 DataSource
对象吗?我检查了 docs,但实际上没有包含有关线程安全的具体信息。
我使用它来避免 lookup
并避免为每个请求创建一个新的 InitialContext
。
是的,应该没问题。由于 DataSource
负责提供 Connection
,因此不使其成为线程安全的将是一个非常糟糕的主意。毕竟大多数程序同时使用多个连接。它可能没有被记录为线程安全和 it's not specified that it should be thread-safe,但任何 sane 实现都是线程安全的。
我对这个话题做了足够的研究,但还没有找到具体的答案。以下是代码片段,
private static Map<String,DataSource> dataSourceMap;
static {
Map<String,DataSource> jndiContextDataSourceMap = new HashMap<>();
try {
jndiContextDataSourceMap.put(JNDI_DEFAULT_DATASOURCE, (DataSource) new InitialContext().lookup(JNDI_DEFAULT_DATASOURCE));
} catch (NamingException namingException) {
logger.error("Unable to obtain default DataSource through JNDI Lookup.", namingException);
}
try {
jndiContextDataSourceMap.put(JNDI_READ_REPLICA, (DataSource) new InitialContext().lookup(JNDI_READ_REPLICA));
} catch (NamingException namingException) {
logger.error("Unable to obtain read only DataSource through JNDI Lookup.", namingException);
}
dataSourceMap = Collections.unmodifiableMap(jndiContextDataSourceMap);
}
可以使用相同的 DataSource
对象吗?我检查了 docs,但实际上没有包含有关线程安全的具体信息。
我使用它来避免 lookup
并避免为每个请求创建一个新的 InitialContext
。
是的,应该没问题。由于 DataSource
负责提供 Connection
,因此不使其成为线程安全的将是一个非常糟糕的主意。毕竟大多数程序同时使用多个连接。它可能没有被记录为线程安全和 it's not specified that it should be thread-safe,但任何 sane 实现都是线程安全的。