Connection
connect(String url,
Properties info)Connection
connect(String url,
Properties info) //meu método
Connection
privateConnect(String url,
Properties info) //método do fornecedor do DriverSim, a conexao proxiada vai pegar os SQL no formato da
PreparedStatement (com ? no lugar dos valores). Eh bem provavel que em
nenhum momento o driver JDBC mande para o servidor ou monte a SQL do
formato que a gente monta (substituindo ? pelos valores), pq a
prepared statement, por motivos de performance eh gerada e guardada no
servidor e o usuario apenas seta os parametros (valores) p/ ela, algo
parecido com uma chamada de funcao. Voce pode ver um ex. de prepared
statement no MySQL no manual
(http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html).
Resumindo, voce quem deve parsear a SQL e substituir os ? por valores
e imprimir depois. Nao eh nda complicado, se voce procurar o codigo da
PreparedStatement do MySQL p/ versoes antigas (que nao suportavam
prepared statement no servidor ainda) voce vai ver como eles faziam e
pode copiar o codigo deles.
> Posso tentar modifica a java.sql.DriverManager, mas modificando a classe
> Driver do fornecedor não seria melhor? No meu teste, eu estava trabalhando
> com o JDBC do MySQL, então, eu teria que modificar a classe
> com.mysql.jdbc.Driver. Essa classe implementa java.sql.Driver e, logo, tem o
> seguinte método que devo modificar:
> Connection connect(String url, Properties info)
Veja bem, o grande problema de trabalhar diretamente com o driver JDBC
eh pq vc vai ter que ter que lidar com as particularidades de cada
implementacao para cada driver para cada versao do JDBC (ufa). E a
interface com o JDBC eh bem definida e documentada, jah a dos drivers
eh, digamos, mais criptica.
> O que eu faço com o JavaAssist é renomear esse método para privateConnect e
> criar um novo método connect idêntico, ficando assim:
>
> Connection connect(String url, Properties info) //meu método
> Connection privateConnect(String url, Properties info) //método do
> fornecedor do Driver
>
>
> O método connect que eu defino apenas chama o privateConnect e encapsula a
> conexão (Connection) retornada em um proxy. Esse proxy para Connection
> apenas encapsula os Statement e PreparedStatement quando a aplicação
> requisitar (por meio dos métodos createStatement() e prepareStatement() da
> classe Connection). E, por fim, as proxies para Statement e
> PreparedStatement pegam a string SQL antes de ela ser executada...
Eh exatamente essa a ideia, esse o melhor caminho a ser seguido.
> O empecilho aqui está sendo modificar esse método connect do Driver... está
> dando erro em tempo de execução... mas isso vai ser consertado... é que não
> sei muito bem usar o javassist...
>
> De qualquer maneira, vc disse: "Vc insere via POA uma modificacao no
> java.sql.DriverManager p/ que te retorne uma conexao sua sobreescrevendo o
> metodo getConnection()". Posso inserir via POA uma modificação em
> com.mysql.jdbc.Driver, retornando uma conexao minha que sobreescreva o
> método connect()??... inserir essa modificação via POA é melhor do que
> editar o .class da classe via javassist??
Vc jah tah usando POA com JavaAssistant, eu que nao conhecia ele. Qto
a dificuldade, eu nao conheco JavaAssistant, mas jah mexi com bcel da
apache (http://jakarta.apache.org/bcel/) e ele eh bem facil de usar.
Sim, a conexao proxiada vai pegar os SQL no formato da
PreparedStatement (com ? no lugar dos valores). Eh bem provavel que em
nenhum momento o driver JDBC mande para o servidor ou monte a SQL do
formato que a gente monta (substituindo ? pelos valores), pq a
prepared statement, por motivos de performance eh gerada e guardada no
servidor e o usuario apenas seta os parametros (valores) p/ ela, algo
parecido com uma chamada de funcao. Voce pode ver um ex. de prepared
statement no MySQL no manual
(http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html).
Veja bem, o grande problema de trabalhar diretamente com o driver JDBC
eh pq vc vai ter que ter que lidar com as particularidades de cada
implementacao para cada driver para cada versao do JDBC (ufa). E a
interface com o JDBC eh bem definida e documentada, jah a dos drivers
eh, digamos, mais criptica.
Veja bem, o grande problema de trabalhar diretamente com o driver JDBCeh pq vc vai ter que ter que lidar com as particularidades de cada
implementacao para cada driver para cada versao do JDBC (ufa). E a
interface com o JDBC eh bem definida e documentada, jah a dos drivers
eh, digamos, mais criptica.
Bom dia, Leandro Ishi!
Para finalizar, o recado seria: sempre que deixamos de utilizar recursos existentes (ex: SGBDs e o seu recurso nativo de replicação, mapeamento objeto relacional, etc.) para resolver um problema "no braço", temos que estar muito seguros de que essa é a ÚNICA estratégia para atender nossos objetivos, pois fora isso, ela não será a melhor estratégia.