【问题标题】:java.net.UnknownHostException: Test: Test: unknown error Failed to get local InetAddress for VMIDjava.net.UnknownHostException:测试:测试:未知错误无法获取 VMID 的本地 InetAddress
【发布时间】:2026-01-10 06:55:01
【问题描述】:

我在 spring-jersey1.8 restful web 服务中使用 c3p0 进行连接池。在启动应用程序时,我收到以下错误:

[com.mchange.v2.c3p0.impl.C3P0ImplUtils] INFO - Failed to get local InetAddress for VMID. This is unlikely to matter. At all. We'll add some extra randomness
java.net.UnknownHostException: Test: Test: unknown error
    at java.net.InetAddress.getLocalHost(InetAddress.java:1484)
    at com.mchange.v2.c3p0.impl.C3P0ImplUtils.generateVmId(C3P0ImplUtils.java:120)
    at com.mchange.v2.c3p0.impl.C3P0ImplUtils.<clinit>(C3P0ImplUtils.java:98)
    at com.mchange.v2.c3p0.impl.PoolBackedDataSourceBase.<init>(PoolBackedDataSourceBase.java:227)
    at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.<init>(AbstractPoolBackedDataSource.java:62)
    at com.mchange.v2.c3p0.ComboPooledDataSource.<init>(ComboPooledDataSource.java:109)
    at com.mchange.v2.c3p0.ComboPooledDataSource.<init>(ComboPooledDataSource.java:105)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:89)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1069)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1021)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4973)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5467)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.net.UnknownHostException: Test: unknown error
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
    at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:907)
    at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1302)
    at java.net.InetAddress.getLocalHost(InetAddress.java:1479)
    ... 35 more

有人知道这个错误是关于什么的吗?

我的 spring-datasource.xml 文件有:

<!-- <context:property-placeholder location="/WEB-INF/spring.properties"></context:property-placeholder> -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
    destroy-method="close"
    p:driverClass="com.mysql.jdbc.Driver"
    p:jdbcUrl="jdbc:mysql://localhost:3306/test2" 
    p:user="root" 
    p:password="root"
    p:acquireIncrement="5" 
    p:idleConnectionTestPeriod="60" 
    p:maxPoolSize="100"
    p:maxStatements="50" 
    p:minPoolSize="10" />

和 pom.xml :

<dependency>
    <groupId>c3p0</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.1.2</version>
</dependency>

【问题讨论】:

    标签: java spring spring-mvc jersey c3p0


    【解决方案1】:

    正如another 线程中所述(在 Steve Waldman 的 cmets 中链接),解决方案是添加缺少的条目

    java.net.UnknownHostException: Test: Test: unknown error
    

    在这种情况下,它是/etc/hosts中的测试

    127.0.0.1    Test
    

    【讨论】:

      【解决方案2】:

      因此,为了防止在不太可能发生的情况下发生冲突,c3p0 尝试为每个 DataSource 提供一个全局唯一的“identityToken”,这部分是通过在前面加上一个“ VMID”,旨在(也许并不奇怪)成为当前 JVM 的唯一标识符。

      VMID 部分由运行它的主机的 Internet 地址确定。所以 c3p0 调用 java.net.InetAddress.getLocalHost() 来找到它。但是对java.net.InetAddress.getLocalHost() 的调用可能会在异常情况下失败,这可能是由于安全原因或某些配置错误。

      所有这一切都是可怕的,可怕的矫枉过正。写完之后,我很害羞,但我因为理论上 identityTokens 可能发生冲突的可能性而失眠,这违反了一个 identityToken 应该映射到唯一池的不变量。所以,就是这样。

      所以,我们找不到本地地址。哎呀。我们回退到为您正在运行的 VM 生成的 VMID 中添加一堆随机性,以减少在实践中发生冲突的可能性已经很小。然后我们继续前进。正如错误消息所说,“这不太重要。完全没有关系。”

      如果您想让错误消失,您需要解决导致在您的环境中调用 getLocalHost() 失败的问题。但你真的可以忽略这一点。

      (看起来您的环境是 IPv6,这可能与它有关。我应该看看这段代码是否适当地健壮以在 VMID 中包含 IPv6 地址。但是您的代码还远远不够重要。)

      【讨论】:

      • 谢谢我知道问题出在哪里,但没有找到解决方案
      • 解决方法就是忽略异常。如果你真的讨厌它,你可以将名为“com.mchange.v2.c3p0.impl.C3P0ImplUtils”的记录器设置为警告级别,但我不建议这样做。 c3p0 旨在记录在 INFO 中。您只会在启动时看到此异常一次,否则它不会造成任何伤害。最好了解为什么 InetAddress.getLocalHost() 在您的环境中失败。但我不确定如何调试它。
      • 环顾四周,请参阅 1) 关于堆栈溢出的建议 *.com/questions/24612100/… 和 2) 几天前修复的 JDK7 错误(!):bugs.java.com/bugdatabase/view_bug.do?bug_id=7180557 可能会升级到最新版本JDK 是要走的路(如果最新发布的版本包含修复)。
      • 感谢@Steve 解决了我的问题。我在主机文件中添加了条目
      最近更新 更多