Situación
Tengo una aplicación web Java (Tomcat) que utiliza jTDS para conectarse a una base de datos MSSQL 2008. Esta aplicación Java ejecuta el 99% de sus procedimientos almacenados MSSQL utilizando la entrada del usuario.jTDS + procedimientos almacenados + prepareSQL = error de nivel de anidamiento?
Problema
El conductor responde jTDS veces (en diferentes lugares de la aplicación) con el error:
Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32).
Podemos evitar esto mediante la adición prepareSQL=0
a la cadena de conexión jTDS. Entonces el error desaparece en todas partes, pero con todos los demás valores de prepareSQL
, el error permanece. No sé cuántos niveles de anidación de procedimientos almacenados jTDS agrega, pero aparentemente es demasiado para nuestra aplicación.
Preguntas
Con procedimientos sólo almacenados para ejecutar, por supuesto, el uso de sentencias preparadas en el código Java, cuánto efecto tiene
prepareSQL=3
(oprepareSQL=0
) tienen para nosotros? En otras palabras: en cada sitio web encuentro personas que dicen "Nunca useprepareSQL=0
en entornos de producción", ¿eso también es aplicable a esta situación?Si
prepareSQL=0
no es una solución recomendada, un problema de seguridad, etc., quizás deberíamos buscar otro controlador. jTDS no se ha actualizado en los últimos 2 años y Microsoft tiene un controlador para JDBC 4.0. Sin embargo, no puedo encontrar referencias ni comparaciones entre jTDS y el controlador JDBC 4.0 de Microsoft. Con los controladores 2.0 y 3.0 de Microsoft, la opinión general parecía ser que jTDS es más rápido, mejor y más eficiente. ¿Sigue siendo así con JDBC 4.0 o Microsoft ha superado a su competidor en esto?
¿Ha logrado identificar este comportamiento con algún procedimiento específico o parece aleatorio? – heikkim
No, no hemos (todavía). Hemos visto este error en dos implementaciones diferentes de nuestra aplicación en dos lugares diferentes de la aplicación, pero cuando ocurrió, fue obstinado y solo se pudo resolver utilizando la solución prepareSQL = 0. – bartlaarhoven