Java 获取Teradata数据源的连接时发生异常
我试图在我的控制器中注入数据源,并使用我想要的连接对象(数据源)。我用的是弹簧靴 我已经编写了两个配置类,一个用于Oracle连接,另一个用于Teradata连接 对于oracle,一切正常,但对于创建teradata数据源,我无法完善任何好的示例,因此我的配置如下所示:Java 获取Teradata数据源的连接时发生异常,java,spring,spring-boot,jdbc,teradata,Java,Spring,Spring Boot,Jdbc,Teradata,我试图在我的控制器中注入数据源,并使用我想要的连接对象(数据源)。我用的是弹簧靴 我已经编写了两个配置类,一个用于Oracle连接,另一个用于Teradata连接 对于oracle,一切正常,但对于创建teradata数据源,我无法完善任何好的示例,因此我的配置如下所示: @Component @Configuration @ConfigurationProperties("application") public class TeradataConfiguration { @NotNull
@Component
@Configuration
@ConfigurationProperties("application")
public class TeradataConfiguration {
@NotNull
private String usernameTeradata;
@NotNull
private String passwordTeradata;
@NotNull
private String servernameTeradata;
@NotNull
private String charsetTeradata;
@NotNull
private String tmodeTeradata;
@NotNull
private String dsnameTeradata;
@NotNull
private String portTeradata;
@NotNull
private String timeoutTeradata;
public void setUsernameTeradata(String usernameTeradata) {
this.usernameTeradata = usernameTeradata;
}
public void setPasswordTeradata(String passwordTeradata) {
this.passwordTeradata = passwordTeradata;
}
public void setServernameTeradata(String servernameTeradata) {
this.servernameTeradata = servernameTeradata;
}
public void setCharsetTeradata(String charsetTeradata) {
this.charsetTeradata = charsetTeradata;
}
public void setTmodeTeradata(String tmodeTeradata) {
this.tmodeTeradata = tmodeTeradata;
}
public void setDsnameTeradata(String dsnameTeradata) {
this.dsnameTeradata = dsnameTeradata;
}
public void setPortTeradata(String portTeradata) {
this.portTeradata = portTeradata;
}
public void setTimeoutTeradata(String timeoutTeradata) {
this.timeoutTeradata = timeoutTeradata;
}
@Bean
DataSource teraDataSource() throws SQLException {
TeraDataSource teraDataSource = new TeraDataSource();
teraDataSource.setServerName(dsnameTeradata);
teraDataSource.setuser(usernameTeradata);
teraDataSource.setpassword(passwordTeradata);
teraDataSource.setCharSet(charsetTeradata);
teraDataSource.setTMODE(tmodeTeradata);
teraDataSource.setDSName(dsnameTeradata);
teraDataSource.setDbsPort(portTeradata);
teraDataSource.setLoginTimeout(Integer.valueOf(timeoutTeradata));
return teraDataSource;
}
}
在此之后,我将这个bean注入到我的控制器中,但当我执行以下操作时:
teraDataSource.getConnection();
我得到以下例外:
TERAJDBC4 ERROR [http-nio-8080-exec-1]
com.teradata.jdbc.jdk6.JDK6_SQL_Connection@fc561d Connection to TEST_DB Fri Oct 05 16:03:10 IST 2018 socket orig=TEST_DB cid=28fb20be sess=0 java.net.UnknownHostException: TEST_DB at
java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) at
java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928) at
java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1323)
at java.net.InetAddress.getAllByName0(InetAddress.java:1276) at
java.net.InetAddress.getAllByName(InetAddress.java:1192) at
java.net.InetAddress.getAllByName(InetAddress.java:1126) at
com.teradata.jdbc.jdbc_4.io.TDNetworkIOIF$Lookup.doLookup(TDNetworkIOIF.ja
va:223) at
com.teradata.jdbc.jdbc_4.io.TDNetworkIOIF$Lookup.getAddresses(TDNetworkIOI
F.java:261) at
com.teradata.jdbc.jdbc_4.io.TDNetworkIOIF.connectToHost(TDNetworkIOIF.java
:381) at
com.teradata.jdbc.jdbc_4.io.TDNetworkIOIF.createSocketConnection(TDNetwork
IOIF.java:156) at com.teradata.jdbc.jdbc_4.io.TDNetworkIOIF.<init>
(TDNetworkIOIF.java:142) at
com.teradata.jdbc.jdbc.GenericTeradataConnection.getIO(GenericTeradataConn
ection.java:143) at
com.teradata.jdbc.jdbc.GenericLogonController.run(GenericLogonController.j
ava:100) at com.teradata.jdbc.jdbc_4.TDSession.<init>
(TDSession.java:211) at com.teradata.jdbc.jdk6.JDK6_SQL_Connection.
<init>(JDK6_SQL_Connection.java:36) at
com.teradata.jdbc.jdk6.JDK6ConnectionFactory.constructSQLConnection(JDK6Co
nnectionFactory.java:25) at
com.teradata.jdbc.jdbc.ConnectionFactory.createConnection(ConnectionFactor
y.java:181) at
com.teradata.jdbc.jdbc.ConnectionFactory.createConnection(ConnectionFactor
y.java:171) at
com.teradata.jdbc.TeraDataSourceBase.createNewConnection(TeraDataSourceBas
e.java:696) at
com.teradata.jdbc.TeraDataSource.getConnection(TeraDataSource.java:21)
at
com.test.dnb.dao.CompanyProfileDAO.writeToTeradataTable(CompanyProfileDAO.
java:1052) at
com.test.dnb.application.Controller.companyFamilyFullTree(Controller.java:
641) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
62) at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorIm
pl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(Inv
ocableHandlerMethod.java:205) at
org.springframework.web.method.support.InvocableHandlerMethod.invokeForReq
uest(InvocableHandlerMethod.java:133) at
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHand
lerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97) at
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandle
rAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) at
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandle
rAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) at
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.ha
ndle(AbstractHandlerMethodAdapter.java:85) at
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherSer
vlet.java:967) at
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServ
let.java:901) at
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkS
ervlet.java:970) at
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.ja
va:861) at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
at
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.
java:846) at
javax.servlet.http.HttpServlet.service(HttpServlet.java:742) at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applicati
onFilterChain.java:231) at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilter
Chain.java:166) at
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applicati
onFilterChain.java:193) at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilter
Chain.java:166) at
org.springframework.web.filter.RequestContextFilter.doFilterInternal(Reque
stContextFilter.java:99) at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerReques
tFilter.java:107) at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applicati
onFilterChain.java:193) at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilter
Chain.java:166) at
org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(H
ttpPutFormContentFilter.java:108) at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerReques
tFilter.java:107) at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applicati
onFilterChain.java:193) at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilter
Chain.java:166) at
org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(Hid
denHttpMethodFilter.java:81) at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerReques
tFilter.java:107) at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applicati
onFilterChain.java:193) at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilter
Chain.java:166) at
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(Ch
aracterEncodingFilter.java:197) at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerReques
tFilter.java:107) at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applicati
onFilterChain.java:193) at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilter
Chain.java:166) at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.
java:199) at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.
java:96) at
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBa
se.java:504) at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:1
40) at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:8
1) at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.ja
va:87) at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342
) at
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
at
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.ja
va:66) at
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProto
col.java:790) at
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.j
ava:1459) at
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.jav
a:49) at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:
1149) at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java
:624) at
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.
java:61) at java.lang.Thread.run(Thread.java:748)
我能够使用Class.forName(“驱动程序名”)通过普通的jdbc连接到teradata,但面临数据源的问题
提前感谢经过一些研发和Mark的帮助,我能够使配置正常工作。我张贴的解决方案,以便其他人可以受益于答案 如果您有如下teradata url:jdbc:teradata://server_name/database=database_nane,tmode=ANSI,charset=UTF8 数据源配置文件应如下所示:
@Component
@Configuration
@ConfigurationProperties("application")
public class TeradataConfiguration {
@NotNull
private String usernameTeradata;
@NotNull
private String passwordTeradata;
@NotNull
private String servernameTeradata;
@NotNull
private String charsetTeradata;
@NotNull
private String tmodeTeradata;
@NotNull
private String dsnameTeradata;
@NotNull
private String portTeradata;
public void setUsernameTeradata(String usernameTeradata) {
this.usernameTeradata = usernameTeradata;
}
public void setPasswordTeradata(String passwordTeradata) {
this.passwordTeradata = passwordTeradata;
}
public void setServernameTeradata(String servernameTeradata) {
this.servernameTeradata = servernameTeradata;
}
public void setCharsetTeradata(String charsetTeradata) {
this.charsetTeradata = charsetTeradata;
}
public void setTmodeTeradata(String tmodeTeradata) {
this.tmodeTeradata = tmodeTeradata;
}
public void setDsnameTeradata(String dsnameTeradata) {
this.dsnameTeradata = dsnameTeradata;
}
public void setPortTeradata(String portTeradata) {
this.portTeradata = portTeradata;
}
@Bean
DataSource teraDataSource() throws SQLException {
TeraDataSource teraDataSource = new TeraDataSource();
//This is username
teraDataSource.setuser(usernameTeradata);
//This is password
teraDataSource.setpassword(passwordTeradata);
//Charset which could be UTF-8 or something else
teraDataSource.setCharSet(charsetTeradata);
//Tmode which could be ANSII or something else
teraDataSource.setTMODE(tmodeTeradata);
//This is your server name
teraDataSource.setDSName(servernameTeradata);
//This is teradata port which by default is 1025
teraDataSource.setDbsPort(portTeradata);
//This is your data base name
teraDataSource.setDatabaseName(dsnameTeradata);
return teraDataSource;
}
}
在这之后,只需将这个bean注入到您的类中,然后执行以下操作
teraDataSource.getConnection()
这将为您提供teradata连接。请发布完整的异常stacktrace;你现在张贴的东西似乎只是在StAcT迹中间的某个地方,这使得它没有信息。请修改格式:为您的属性使用代码块;很难阅读,因为您使用了引号块。@MarkRotterVeel我添加了完整的堆栈跟踪,请看一下:java.net.UnknownHostException:TEST_DB似乎表明您的连接配置有误;它尝试使用名称
TEST\u DB
连接到数据库服务器,而我认为您打算将其作为数据库名称,而不是服务器名称。您可能想查看teradasource
的文档,看看应该如何映射属性。@MarkrotVeel感谢您指出了连接部分,也感谢我在文档中提出的建议,在测试了几个组合后,终于让代码正常工作了。这真的很有帮助,我想知道如果他们需要连接到三个不同的teradata数据库,他们会做些什么,或者使用datasourceName?
teraDataSource.getConnection()