2009-08-26 19 views
34

Estoy tratando de seguir el tutorial JDBC de Sun en http://java.sun.com/docs/books/tutorial/jdbc/basics/connecting.html¿Cómo configuro manualmente un DataSource en Java?

Se da el siguiente código de ejemplo:

DataSource ds = (DataSource) org.apache.derby.jdbc.ClientDataSource() 
ds.setPort(1527); 
ds.setHost("localhost"); 
ds.setUser("APP") 
ds.setPassword("APP"); 

Connection con = ds.getConnection(); 

Este código no compilará porque la interfaz DataSource no tiene ninguno de estos métodos, a excepción de la getConnection() método invocado al último.

(Aquí está el javadoc: http://java.sun.com/javase/6/docs/api/javax/sql/DataSource.html)

¿Qué me falta?

Editar: En realidad estoy tratando de conectar a MySQL (com.mysql.jdbc) y no puedo encontrar el javadoc para eso. Voy a aceptar una respuesta que me señala a cualquiera:

1) la documentación para com.mysql.jdbc con respecto a un DataSource que pueda entender, o

2) da un ejemplo a seguir por lo que el código del tutorial debe ser , para cualquier base de datos

+0

Aquí hay algunos ejemplos: http://www.tugay.biz/2016/09/hikaricp-hello-world.html http://www.tugay.biz/2016/09/bonecp-hello- world.html http://www.tugay.biz/2016/07/tomcat-connection-pool-vs-apache.html –

Respuesta

17

Básicamente en JDBC la mayoría de estas propiedades no son configurables en la API así, sino que dependen de la implementación. La forma en que JDBC maneja esto es permitiendo que la URL de conexión sea diferente por proveedor.

Así que lo que hace es registrar el controlador para que el sistema de JDBC puede saber qué hacer con la URL:

DriverManager.registerDriver((Driver) Class.forName("com.mysql.jdbc.Driver").newInstance()); 

A continuación, forman la URL:

String url = "jdbc:mysql://[host][,failoverhost...][:port]/[database][?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]" 

Y, por último, el uso para obtener una conexión:

Connection c = DriverManager.getConnection(url); 

En JDBC más sofisticada, se involucra con grupos de conexiones y similares, y los servidores de aplicaciones a menudo tienen su propia manera de registrar los controladores en JNDI y usted busca un DataSource desde allí y llama a getConnection en él.

En términos de qué propiedades admite MySQL, consulte here.

EDITAR: Una idea más, técnicamente solo tiene una línea de código que hace que Class.forName ("com.mysql.jdbc.Driver") sea suficiente, ya que la clase debe tener su propio inicializador estático que registra una versión , pero a veces un controlador JDBC no lo hace, así que si no está seguro, hay poco daño al registrar un segundo, simplemente crea un objeto duplicado en memeory.

+0

Bueno, eso funciona. Quería DataSource, ya que el tutorial decía que era preferible, pero lo tomaré. –

+10

DataSource es realmente para servidores de aplicaciones y otros contenedores que suministran un servicio JNDI. Sin un servicio JNDI, no tienen mucho sentido, y el tutorial honestamente no está muy bien escrito sobre ese punto. – Yishai

+0

Puede crear su propia clase para implementar la interfaz de DataSource utilizando el código anterior para los métodos getConnection. Más allá de eso, solo necesita implementar getters y setters para loginTimeout y LogWriter. – GregA100k

1

El javadoc para DataSource al que se refiere es del paquete incorrecto. Deberías mirar javax.sql.DataSource. Como pueden ver, esta es una interfaz. La configuración de nombre de host y puerto depende de la implementación, es decir, del controlador JDBC que está utilizando.

No he comprobado los javadocs Derby pero supongo que el código debe compilar la siguiente manera:

ClientDataSource ds = org.apache.derby.jdbc.ClientDataSource() 
ds.setHost etc.... 
2

creo que el ejemplo está mal - javax.sql.DataSource no tiene estas propiedades tampoco. Su DataSource debe ser del tipo org.apache.derby.jdbc.ClientDataSource, que debe tener esas propiedades.

119

Una cosa que quizás quiera ver es el proyecto Commons DBCP. Proporciona un BasicDataSource que está configurado de manera similar a su ejemplo. Para usarlo necesita el JAR JDBC del proveedor de la base de datos en su classpath y debe especificar el nombre de la clase de controlador del proveedor y la URL de la base de datos en el formato adecuado.

Editar:

Si desea configurar un BasicDataSource para MySQL, que haría algo como esto:

BasicDataSource dataSource = new BasicDataSource(); 

dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 
dataSource.setUsername("username"); 
dataSource.setPassword("password"); 
dataSource.setUrl("jdbc:mysql://<host>:<port>/<database>"); 
dataSource.setMaxActive(10); 
dataSource.setMaxIdle(5); 
dataSource.setInitialSize(5); 
dataSource.setValidationQuery("SELECT 1"); 

código que necesita un DataSource entonces puede usar eso.

+0

Utilicé esta publicación para crear pruebas unitarias –

+0

Thanx heaps .... xml estaba haciendo mi cabeza en .... –

16

DataSource es específica del proveedor, para MySql usted podría utilizar MysqlDataSource que se proporciona en el conector MySql Java jar:

MysqlDataSource dataSource = new MysqlDataSource(); 
    dataSource.setDatabaseName("xyz"); 
    dataSource.setUser("xyz"); 
    dataSource.setPassword("xyz"); 
    dataSource.setServerName("xyz.yourdomain.com"); 
+3

Si va a responder una pregunta formulada hace 4.5 años , sería bueno indicar por qué las respuestas actuales son insuficientes. –

+8

A diferencia de la respuesta oficialmente aceptada, esta aborda directamente la pregunta. Gracias @Luke. – stickfigure

2

uso MySQL como Ejemplo: 1) utilizar agrupaciones de conexiones de bases de datos: Por ejemplo: Apache Commons DBCP, también, usted necesita el paquete frasco basicDataSource en la ruta de clases

@Bean 
public BasicDataSource dataSource() { 
    BasicDataSource ds = new BasicDataSource(); 
    ds.setDriverClassName("com.mysql.jdbc.Driver"); 
    ds.setUrl("jdbc:mysql://localhost:3306/gene"); 
    ds.setUsername("root"); 
    ds.setPassword("root"); 
    return ds; 
} 

2) usar un controlador basado en JDBC se utiliza por lo general si no tienen en cuenta la agrupación de conexiones:

@Bean 
public DataSource dataSource(){ 
    DriverManagerDataSource ds = new DriverManagerDataSource(); 
    ds.setDriverClassName("com.mysql.jdbc.Driver"); 
    ds.setUrl("jdbc:mysql://localhost:3306/gene"); 
    ds.setUsername("root"); 
    ds.setPassword("root"); 
    return ds; 
} 
Cuestiones relacionadas