Situazione
Ho un'applicazione Web (Tomcat) Java 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.jTDS + stored procedure + prepareSQL = errore del livello di annidamento?
Problema
Il driver jTDS risponde a volte (a diversi posti nella domanda) con l'errore:
Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32).
Possiamo evitare questo 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
Con solo stored procedure per eseguire, ovviamente utilizzando prepared statement nel codice Java, quanto effetto fa
prepareSQL=3
(oprepareSQL=0
) hanno per noi? In altre parole: su tutti i siti Web trovo che le persone dicono "Non usare maiprepareSQL=0
negli ambienti di produzione", è applicabile anche a questa situazione?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?
Sei riuscito a individuare questo comportamento in una procedura specifica o sembra casuale? – heikkim
No, non abbiamo (ancora). Abbiamo visto questo errore in due diverse implementazioni della nostra applicazione in due diversi punti dell'applicazione, ma quando si è verificato, è stato testardo e potrebbe essere risolto solo utilizzando la soluzione prepareSQL = 0. – bartlaarhoven