java - for - jTDS+stored procedure+prepareSQL=errore del livello di annidamento?



jtds library download (1)

Situazione
Ho un'applicazione Web Java (Tomcat) che utilizza jTDS per connettersi a un database MSSQL 2008. Questa applicazione Java esegue il 99% delle sue stored procedure MSSQL utilizzando l'input dell'utente.

Problema
Il driver jTDS risponde a volte (in diversi punti dell'applicazione) con errore:

La stored procedure massima, la funzione, il trigger o il livello di nidificazione delle visualizzazioni hanno superato (limite 32).

Possiamo evitarlo aggiungendo prepareSQL=0 alla stringa di connessione jTDS. Quindi l'errore scompare ovunque, ma con tutti gli altri valori di prepareSQL , l'errore rimane. Non so quanti livelli di nesting delle stored procedure aggiungono jTDS, ma a quanto pare è troppo per la nostra applicazione.

Domande

  1. Con solo le procedure memorizzate da eseguire, ovviamente usando le istruzioni preparate nel codice Java, quanti effetti prepareSQL=3 per noi prepareSQL=3 (o prepareSQL=0 )? In altre parole: su ogni sito Web trovo che le persone dicono "Non usare mai prepareSQL=0 negli ambienti di produzione", è applicabile anche a questa situazione?

  2. Se prepareSQL=0 non è una soluzione consigliata, un problema di sicurezza, ecc., Dovremmo forse cercare un altro driver. jTDS non è stato aggiornato negli ultimi 2 anni e Microsoft ha un driver per JDBC 4.0. Non riesco però a trovare benchmark o confronti tra jTDS e il driver JDBC 4.0 di Microsoft. Con i driver Microsoft 2.0 e 3.0, l'opinione generale sembrava essere che jTDS fosse più veloce, migliore, più efficiente. È ancora così con JDBC 4.0 o Microsoft ha superato il suo concorrente in questo?


Answer #1

quando prepareSQL non è uguale a 0 jTDS aggiungi esattamente un livello di nidificazione. Prendi in considerazione la seguente procedura:

CREATE PROCEDURE F @v int
AS
BEGIN
    select @v = @v - 1
    IF @v = 0 SELECT @v
    ELSE EXEC F @v
END

E il codice java che lo usa:

 Connection connection = DriverManager.getConnection("jdbc:jtds:sqlserver://xxx.xxx.xxx.xxx:1433/xxx;prepareSQL=0");
 PreparedStatement statement = connection.prepareStatement("EXEC F ?");
 statement.setInt(1, 32);
 statement.execute();

Se si imposta prepareSQL su un valore diverso da 0, fallirà con "La stored procedure massima, la funzione, il trigger o il superamento del livello di nidificazione della vista (limite 32)". Hai bisogno di trovare il motivo per cui il tuo codice usa così tanto annidamento? PreparSQL = 0 stai impedendo a mssql di usare gli stame e quelli che costringono ad analizzare SQL su ogni esecuzione. Non è un grosso problema se il tempo di esecuzione delle istruzioni è molto più tempo di compilazione delle istruzioni (se il procedimento memorizzato viene eseguito 10 secondi non è un problema se la compilazione richiede 10 ms in più). Cambiare driver non ti aiuterà perché avrai gli stessi problemi.





jtds