TL; DR
使用HornetQ设置配置HA-JNDI服务的步骤是什么?我相信文档有点分散.我在这里阅读了文档,但似乎没有详细说明.
更长的版本:
所以我们有一个HornetQ JMS设置和JNDI.我们已经说了5台服务器,每台服务器运行带有JNDI服务的HornetQ JMS主实例.在这5台服务器中的每台服务器上,我们还有一台运行其他HornetQ主机的从机.
为了显示:
Server A - HornetQa_master, JNDI, HornetQb_slave
Server B - HornetQb_master, JNDI, HornetQc_slave
Server C - HornetQc_master, JNDI, HornetQd_slave
Server D - HornetQd_master, JNDI, HornetQe_slave
Server E - HornetQe_master, JNDI, HornetQa_slave
Run Code Online (Sandbox Code Playgroud)
这些HornetQ服务器中的每一个都充当我们各种后端需求的中间件,因此这意味着5个服务器,5个HornetQ主实例,5个HornetQ从属实例和5个JNDI服务器.然而,这个设置的问题是,如果服务器主机(不仅仅是进程,主机本身),说A发生故障,理想情况下服务应该回退到运行在服务器E上的HornetQ,后者托管A的HornetQ从站.但是,要继续作为HornetQ master,HornetQa_slave需要与在服务器A上运行的JNDI进程通信(我假设要复制消息).由于主机A本身已关闭,因此在E上运行的HornetQa_slave无法与A上的JNDI通信,因此无法作为主进程恢复.
如果JNDI服务高度可用,则从属HornetQ进程可以按预期恢复为主服务器.任何人都可以指向文档或简单说明我们如何将现有设置转换为HA-JNDI?对于它的价值,我已经阅读了多个来源,但它似乎没有详细说明如何配置HA-JNDI.如果您需要有关我们当前设置的更多信息,请与我们联系.
谢谢
据说在关于DriverManagerDataSource
类的Spring javadoc文章中,这个类非常简单并且推荐使用
使用容器提供的JNDI DataSource.这样的一个
DataSource
可以DataSource
在Spring ApplicationContext via中作为bean 公开JndiObjectFactoryBean
问题是:我该如何做到这一点?
例如,如果我希望有DataSource
bean来访问我的自定义MySQL数据库,那么我需要什么呢?我应该在上下文配置等中写什么?
我花了太多时间在连接一些JNDI工厂bean时试图找出一些错误.结果问题是,而不是......
<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/loc"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
我其实写了这个......
<bean id="someId" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/loc"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
我推断java:comp/env /可能引用了一些环境变量,并最终使我的上下文文件被查看.唯一的区别是java:comp/env /.从专家的口中,这是做什么的?
如果没有值中的java:comp/env前缀,我将收到一条错误,指出"Name jdbc未绑定在此Context中".
我正在尝试使用JNDI为Spring Web应用程序设置数据库连接属性.
我正在考虑以下两种方法:
方法1:
在Spring配置中,您可能会遇到以下情况:
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/facs"/>
Run Code Online (Sandbox Code Playgroud)
然后在你的webapp /META-INF/context.xml文件中你也应该有类似的东西:
<?xml version='1.0' encoding='utf-8'?>
<!-- antiResourceLocking="true" -->
<Context path="/podd-apn"
reloadable="true"
cachingAllowed="false"
antiResourceLocking="true"
>
<Resource name="jdbc/facs"
type="javax.sql.DataSource" username="${database.username}" password="${database.password}"
driverClassName="org.postgresql.Driver"
url="${database.url}"
maxActive="8" maxIdle="4"
global="jdbc/facs"
/>
</Context>
Run Code Online (Sandbox Code Playgroud)
在你的web.xml中,你应该这样:
<!-- JNDI -->
<resource-ref>
<description>FACs Datasource</description>
<res-ref-name>jdbc/facs</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
Run Code Online (Sandbox Code Playgroud)
方法2:
在Spring上下文中设置如下:
<jee:jndi-lookup id="dbDataSource"
jndi-name="jdbc/DatabaseName"
expected-type="javax.sql.DataSource" />
Run Code Online (Sandbox Code Playgroud)
您可以使用以下内容在Tomcat的server.xml中声明JNDI资源:
<GlobalNamingResources>
<Resource name="jdbc/DatabaseName" auth="Container" type="javax.sql.DataSource"
username="dbUsername" password="dbPasswd"
url="jdbc:postgresql://localhost/dbname"
driverClassName="org.postgresql.Driver"
initialSize="5" maxWait="5000"
maxActive="120" maxIdle="5"
validationQuery="select 1"
poolPreparedStatements="true"/>
</GlobalNamingResources/>
Run Code Online (Sandbox Code Playgroud)
并从Tomcat的web context.xml引用JNDI资源,如下所示:
<ResourceLink name="jdbc/DatabaseName"
global="jdbc/DatabaseName"
type="javax.sql.DataSource"/>
Run Code Online (Sandbox Code Playgroud)
我的问题是保留数据库属性的最佳位置在哪里?它们应该放在server.xml还是context.xml中 …
是什么意思java:comp/env
?
看起来像什么:
Context envContext = (Context)initContext.lookup("java:comp/env");
Run Code Online (Sandbox Code Playgroud)
做什么?
我明白这样的查找:
(DataSource)envContext.lookup("jdbc/MyDatasource")
Run Code Online (Sandbox Code Playgroud)
MyDatasource
在context.xml
或中查找名称web.xml
以获取数据库的URL.是这样吗 ?!但是前者看起来做了什么?
我正在为EJB编写客户端,在尝试执行它时,我得到以下异常:
javax.naming.NoInitialContextException:需要在环境或系统属性中指定类名,或在applet参数中指定类名,或在应用程序资源文件中指定.
我只是无法理解问题所在.
为什么它说空 URL并在我提供数据库URL时在异常中给出一个空的''类?
我尝试context.xml
在使用时通过servlet 连接到数据库web.xml
.当servlet运行时,我得到以下异常:
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1452)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
at servlets.servlet_1.doGet(servlet_1.java:23) // ---> Marked the statement in servlet
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)
Caused by: …
Run Code Online (Sandbox Code Playgroud) 任何人都可以帮助解释为什么JNDI应该是公开数据库/ jms等服务的首选方式吗?
我遇到的帖子都谈到了不必加载特定驱动程序管理器的优势,从连接池等方面受益,但通过在属性文件中指定驱动程序管理器并使用反射可以轻松实现.
连接池也可以通过弹簧或其他方式将正确的实现连接到应用程序bean中来实现.
那么为什么使用JNDI会更好呢?