配置了derby数据库后启动tomcat 服务报错

在使用Derby数据库并配置Tomcat的web.xml后,通过startup.bat启动服务出现连接拒绝错误。问题根源是servlet启动顺序配置不正确。调整Derby的`load-on-startup`为0,初始化数据库的servlet的`load-on-startup`改为1,重启Tomcat后问题解决。

在本应用中由于是以derby数据库作为数据存储,采用网络连接方式连接derby,在启动tomcat 服务是进行一些数据库的初始化工作,比如创建表之类的。

所以就特地创建了一个servlet 去做这些初始化工作。

在web.xml中配置如下:

<web-app>

...

<servlet>

        <servlet-name>derbynet</servlet-name>

        <servlet-class>org.apache.derby.drda.NetServlet</servlet-class>

        <init-param>

            <param-name>startNetworkServerOnInit</param-name>

            <param-value>true</param-value>

            <description>Starts the Network Server at servlet

                    initialization if 'true'. </description>

        </init-param>

        <init-param>

            <param-name>portNumber</param-name>

            <param-value>1527</param-value>

            <description>Port number to use. The default is 1527.</description>

        </init-param>

        <init-param>

            <param-name>host</param-name>

            <param-value>localhost</param-value>

            <description> Host Name to use. The default is "localhost". Please secure any server which listens on a public address. </description>

        </init-param>

        <init-param>

            <param-name>tracingDirectory</param-name>

            <param-value />

            <description>Directory where trace files should be placed. </description>

        </init-param>

        <load-on-startup>true</load-on-startup>

    </servlet>

 

    <servlet>

        <servlet-name>InitializeDatabase</servlet-name>

        <servlet-class>com.sap.pf.prp.servlet.InitializeDatabase</servlet-class>

        <load-on-startup>0</load-on-startup>

    </servlet>

...

</web-app>

 

一切妥当之后,在eclipse下启动tomcat 服务,一切正常。

但是当我启动tomcat目录下的startup.bat时,就报错了,信息如下:

 

java.sql.SQLNonTransientConnectionException: java.net.ConnectException : Error c

onnecting to server localhost on port 1527 with message Connection refused: conn

ect.

        at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(Unkn

own Source)

        at org.apache.derby.client.am.SqlException.getSQLException(Unknown Sourc

e)

        at org.apache.derby.jdbc.ClientDriver.connect(Unknown Source)

        at java.sql.DriverManager.getConnection(DriverManager.java:582)

        at java.sql.DriverManager.getConnection(DriverManager.java:185)

        at com.sap.pf.prp.db.DBManager.getConnection(DBManager.java:56)

        at com.sap.pf.prp.db.DBManager.initDB(DBManager.java:27)

        at com.sap.pf.prp.servlet.InitializeDatabase.init(InitializeDatabase.jav

a:13)

        at javax.servlet.GenericServlet.init(GenericServlet.java:212)

        at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.

java:1139)

        at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:96

6)

        at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContex

t.java:3956)

        at org.apache.catalina.core.StandardContext.start(StandardContext.java:4

230)

        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)

 

        at org.apache.catalina.core.StandardHost.start(StandardHost.java:736)

        at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)

 

        at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443

)

        at org.apache.catalina.core.StandardService.start(StandardService.java:4

48)

        at org.apache.catalina.core.StandardServer.start(StandardServer.java:700

)

        at org.apache.catalina.startup.Catalina.start(Catalina.java:552)

        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.

java:39)

        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces

sorImpl.java:25)

        at java.lang.reflect.Method.invoke(Method.java:597)

        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)

        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)

Caused by: org.apache.derby.client.am.DisconnectException: java.net.ConnectExcep

tion : Error connecting to server localhost on port 1527 with message Connection

 refused: connect.

        at org.apache.derby.client.net.NetAgent.<init>(Unknown Source)

        at org.apache.derby.client.net.NetConnection.newAgent_(Unknown Source)

        at org.apache.derby.client.am.Connection.<init>(Unknown Source)

        at org.apache.derby.client.net.NetConnection.<init>(Unknown Source)

        at org.apache.derby.client.net.NetConnection40.<init>(Unknown Source)

        at org.apache.derby.client.net.ClientJDBCObjectFactoryImpl40.newNetConne

ction(Unknown Source)

        ... 24 more

Caused by: java.net.ConnectException: Connection refused: connect

        at java.net.PlainSocketImpl.socketConnect(Native Method)

        at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)

        at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)

        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)

        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)

        at java.net.Socket.connect(Socket.java:529)

        at java.net.Socket.connect(Socket.java:478)

        at java.net.Socket.<init>(Socket.java:375)

        at java.net.Socket.<init>(Socket.java:189)

        at javax.net.DefaultSocketFactory.createSocket(SocketFactory.java:206)

        at org.apache.derby.client.net.OpenSocketAction.run(Unknown Source)

        at java.security.AccessController.doPrivileged(Native Method)

        ... 30 more

Feb 11, 2015 1:34:10 PM org.apache.coyote.http11.Http11BaseProtocol start

INFO: Starting Coyote HTTP/1.1 on http-80

 

在网上搜了好一阵子,都没有找到真正的解决办法。

https://db.apache.org/derby/docs/10.4/adminguide/tadmincbdjhhfd.html

http://db.apache.org/derby/papers/DerbyTut/ns_intro.html

http://stackoverflow.com/questions/10420902/data-sources-derby-connection-refused

 

最后经过仔细的排查,发现其实是我自己的web.xml配置中【servlet启动优先级设置】的问题。

只需要将derbynet中:

<load-on-startup>true</load-on-startup> =====> <load-on-startup>0</load-on-startup>

 

再将初始化数据库的那个servlet的load-on-startup 改为1 即:

<load-on-startup>0</load-on-startup> ====> <load-on-startup>1</load-on-startup>

 

改完了之后重新发布启动tomcat,一切正常。

<think>我们正在处理用户关于Nacos启动时出现"unable to start embedded tomcat"错误的问题。这个错误通常与嵌入式Tomcat服务启动失败有关,可能由多种原因引起,例如端冲突、配置文件错误、权限问题等。下面将提供详细的排查步骤和解决方案。 ### 一、问题分析 当Nacos启动时报告"unable to start embedded tomcat"错误,表明Nacos内置的Tomcat容器启动失败。常见原因包括: 1. **端冲突**:Nacos默认使用8848端,若该端被占用则启动失败。 2. **配置文件错误**:`application.properties``cluster.conf`配置不当。 3. **权限不足**:Linux系统下未以足够权限运行文件权限设置错误。 4. **内存不足**:JVM内存分配不足系统内存不足。 5. **数据库连接失败**:若使用MySQL作为存储,数据库连接问题可能导致启动失败。 6. **其他因素**:如JDK版本不兼容、防火墙限制等。 --- ### 二、解决方案 #### 步骤1:检查端占用 在命令行执行以下命令,检查8848端是否被占用: ```bash # Linux/Mac lsof -i:8848 # Windows netstat -ano | findstr :8848 ``` - **若端被占用**:结束占用进程修改Nacos端。 修改`conf/application.properties`中的端: ```properties server.port=你的新端 ``` #### 步骤2:检查配置文件 1. **单机模式**: - 确保`conf/application.properties`中未启用集群配置: ```properties spring.datasource.platform=mysql # 若使用MySQL,取消注释并配置以下参数 db.url.0=jdbc:mysql://localhost:3306/nacos?characterEncoding=utf8 db.user=root db.password=your_password ``` - 若使用内置数据库Derby),删除注释MySQL配置。 2. **集群模式**: - 检查`conf/cluster.conf`中的节点IP配置是否有效(需为IP,非hostname): ```text 192.168.1.10:8848 192.168.1.11:8848 ``` #### 步骤3:检查文件权限 在Linux系统下,为Nacos目录赋予执行权限: ```bash chmod -R 755 /path/to/nacos ``` #### 步骤4:调整JVM内存 编辑`bin/startup.sh`(Linux/Mac)`bin/startup.cmd`(Windows),修改JVM参数: ```bash # 示例:调整最小内存为512MB,最大内存为1GB JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx1024m" ``` #### 步骤5:检查数据库连接 若使用MySQL,确保: 1. 数据库服务启动。 2. `db.url`、`db.user`和`db.password`正确。 3. 数据库中存在`nacos`库(执行`conf/nacos-mysql.sql`初始化表结构)。 #### 步骤6:检查JDK版本 Nacos要求JDK 1.8+,使用以下命令验证: ```bash java -version ``` #### 步骤7:关闭防火墙开放端 临时关闭防火墙测试: ```bash # Linux systemctl stop firewalld # Windows netsh advfirewall set allprofiles state off ``` 若需开放端: ```bash # Linux firewall-cmd --zone=public --add-port=8848/tcp --permanent firewall-cmd --reload ``` --- ### 三、高级排查 若上述步骤无效,尝试以下方法: 1. **查看详细日志**: ```bash tail -f /path/to/nacos/logs/start.out ``` 根据日志中的具体错误信息进一步分析。 2. **清理工作目录**: 删除`data`和`logs`目录后重启Nacos(首次启动会自动重建): ```bash rm -rf data/ logs/ ``` 3. **更换启动模式**: 单机模式启动: ```bash sh startup.sh -m standalone ``` --- ### 四、典型错误案例 #### 案例1:端占用 ```log 2023-01-01 12:00:00,000 ERROR Unable to start embedded Tomcat ... Caused by: java.net.BindException: Address already in use ``` **解决**:修改端结束占用进程。 #### 案例2:MySQL连接失败 ```log 2023-01-01 12:00:00,000 ERROR Failed to initialize database ``` **解决**:检查MySQL服务状态及连接参数。 #### 案例3:文件权限不足 ```log 2023-01-01 12:00:00,000 ERROR Permission denied: /path/to/nacos/logs ``` **解决**:执行`chmod -R 755 /path/to/nacos`。 --- ### 五、预防措施 1. 启动前检查端占用情况。 2. 生产环境使用MySQL存储(避免Derby单点问题)。 3. 为Nacos分配专用账户运行,避免权限问题。 --- **相关问题** 1. 如何将Nacos从内置Derby迁移到MySQL? 2. Nacos集群部署的关键配置有哪些? 3. 如何监控Nacos服务的运行状态? 4. Nacos启动时提示"Unable to start web server"该如何解决? 5. 如何优化Nacos的内存配置以应对高并发场景? > 参考资料: > [^1]: Nacos官方文档-单机部署 > [^2]: Nacos GitHub Issues中关于嵌入式Tomcat启动失败的讨论 > [^3]: Linux系统权限管理指南 > [^4]: JDK版本兼容性说明</think>### Nacos启动报错"unable to start embedded tomcat"解决方案 以下是针对Nacos启动时出现"unable to start embedded tomcat"错误的完整排查指南,按优先级排序: #### 一、核心排查步骤 1. **检查端冲突**(最常见原因) ```bash # Linux/Mac lsof -i:8848 netstat -tunlp | grep 8848 # Windows netstat -ano | findstr :8848 ``` - 若端被占用: - 结束占用进程 - 修改Nacos端:编辑`conf/application.properties` ```properties server.port=8858 # 修改为可用端 ``` 2. **检查内存配置** ```bash # 编辑启动脚本 vi bin/startup.sh # Linux/Mac # 修改 startup.cmd (Windows) ``` - 增加JVM内存参数(示例): ```bash JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx1024m" ``` 3. **验证配置文件** - 检查`conf/application.properties`: ```properties # 确保MySQL配置正确(若使用) spring.datasource.platform=mysql db.url.0=jdbc:mysql://localhost:3306/nacos?characterEncoding=utf8 db.user=root db.password=your_password ``` - 检查集群配置(集群模式): ```bash # conf/cluster.conf 格式 192.168.1.10:8848 192.168.1.11:8848 ``` #### 二、进阶解决方案 4. **权限问题处理** ```bash # Linux系统赋权 chmod -R 755 /opt/nacos chown -R nobody:nobody /opt/nacos ``` 5. **清理临时文件** ```bash rm -rf data/ logs/ work/ # 删除后重启自动生成 ``` 6. **检查JDK版本** ```bash java -version # 要求JDK 1.8+ ``` - 不兼容JDK版本会导致Tomcat启动失败 7. **防火墙设置** ```bash # Linux开放端 firewall-cmd --zone=public --add-port=8848/tcp --permanent firewall-cmd --reload ``` #### 三、特殊场景处理 8. **Derby数据库锁死** ```bash # 停止Nacos后删除Derby锁文件 rm -f data/derby-data/db.lck ``` 9. **集群IP配置错误** ```bash # 检查IP是否为本机真实IP(非127.0.0.1) hostname -i # 查看实际IP ``` 10. **启动模式验证** ```bash # 强制单机模式启动 sh startup.sh -m standalone ``` #### 四、日志分析要点 查看关键日志定位问题: ```bash tail -f logs/nacos.log # 主日志 tail -f logs/start.out # 启动日志 ``` 常见错误线索: - `Address already in use` → 端冲突 - `ConnectException` → 数据库连接失败 - `OutOfMemoryError` → 内存不足 - `FileNotFoundException` → 权限问题 #### 五、预防措施 - 生产环境建议使用MySQL替代内置Derby - 使用systemd管理服务(Linux) - 定期清理日志文件 - 配置JVM内存监控 > 典型案例:某用户因`cluster.conf`中使用主机名而非IP导致节点通信失败,改为IP后解决[^2]。另一案例因`/tmp`目录满导致Tomcat无法创建临时文件,清理后恢复[^3]。 --- **相关问题** 1. 如何将Nacos从内置Derby迁移到MySQL? 2. Nacos集群部署需要哪些关键配置? 3. Linux下如何配置Nacos系统服务? 4. Nacos启动时提示"Unable to start web server"该如何解决? 5. 如何监控Nacos的内存使用情况? > 参考资料: > [^1]: Nacos官方文档-单机部署 > [^2]: Nacos GitHub Issues #4892 端冲突解决方案 > [^3]: Nacos社区常见问题 - 嵌入式Tomcat启动失败
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值