Pregunta

Estamos trabajando en un proyecto de PHP, que ha estado en desarrollo durante más de 2 años, y ahora el equipo está listo y siente la voluntad de cambiar el desarrollo a un ORM. Porque realmente acelera el desarrollo y le permite operar con Objetos y no pensar en términos de código SQL y tablas de bases de datos la mayor parte del tiempo.

Hemos decidido elegir la Doctrine ORM, porque tiene YAML carga de dispositivos de datos: lo necesitamos mucho para nuestras pruebas unitarias.

El principal temor que tengo, es que el uso de un nuevo marco ORM puede disminuir el rendimiento del sitio. No podemos establecer una conexión compartida entre la capa de abstracción de la base de datos actual (que utiliza la sintaxis pg_connect , no DOP -compatible). El mecanismo de conexión a la base de datos no se puede cambiar a compatible con PDO, porque hay muchos códigos SQL incompatibles con la sintaxis PDO_SQLITE.

Entonces, como lo entiendo, si vamos a comenzar a usarlo, duplicará el número de conexiones de base de datos. No estoy seguro de que el servidor de base de datos pueda manejar esto.

¿Qué nos recomendarías hacer en esta circunstancia?

¿Fue útil?

Solución

¿Qué relevancia tiene PDO_SQLITE?

A menos que realmente planee usar el controlador SQLite, entonces la compatibilidad no es obligatoria por PDO.

Si no va a usar SQLite, haría que la capa de base de datos heredada fuera compatible con PDO y reutilizaría las conexiones hasta que pueda migrar completamente a Doctrine.

Dicho esto, el nivel de conexiones no será su único problema de rendimiento al cambiar a un ORM. Son inherentemente ineficientes, por lo que esperaría consultas más lentas, un mayor uso del ancho de banda entre los servidores de aplicaciones y los servidores de bases de datos y un mayor uso de la memoria en el nivel de la aplicación debido a la inevitable selección de datos redundantes. Dependiendo de su configuración actual, lo anterior puede o no ser un problema.

Probablemente deberías tomar ese último párrafo con una pizca de sal porque son solo rasgos de los ORM en general y no de Doctrine en particular, con los que no tengo experiencia.

Otros consejos

Lo obvio que puede hacer es no abrir una conexión de base de datos hasta que la necesite. Personalmente uso código como este:

public function connect() {
  if (!defined('CONNECT')) {
    mysql_connect(...);
  }
}

public function db_query($query) {
  connect();
  $ret = mysql_query($query);
  if (!$ret) {
    die(mysql_error());
    error_log(mysql_error() . ' - ' . $query);
  }
  return $ret;
}

para reducir la cantidad de repeticiones y para abrir solo una conexión cuando la necesite.

En tu caso, entonces necesitas romper la porción más pequeña que puedas para comenzar. Idealmente, debería ser una división vertical , lo que significa que esta división hará casi todo el trabajo de su base de datos con el nuevo código y muy poco con el anterior. De esta manera, puede duplicar las conexiones de la base de datos y esto le permite desarrollar algunas habilidades y obtener algo de experiencia también.

Tenga cuidado, sin embargo, ORM no es, de ninguna manera, una panacea. Es posible que odie el SQL y lo encuentre complicado y propenso a errores, pero en su mayor parte, simplemente está cambiando un conjunto de problemas por otro. Personalmente creo que si bien el ORM puede ser útil, ha sido sobrevalorado y es más una economía falsa de lo que muchos se dan cuenta o están dispuestos a admitir. Escribí más sobre esto en ¿Utilizando un ORM o SQL simple?

No estoy diciendo que no debas hacerlo. Simplemente no entres en pensar que resolverá todos tus problemas. Además, dado que esta reescritura no cambiará realmente la funcionalidad en absoluto (de lo que ha descrito), no estoy seguro si el costo de hacerlo se compara favorablemente con arreglar lo que ya existe. Demasiadas incógnitas para decir en qué dirección irá tu situación.

Bueno, sí y no: sus conexiones de base de datos solo se duplicarán siempre que tenga una conexión que no sea PDO y PDO.

No estoy seguro de qué quiere decir con la referencia PDO_SQLITE, ya que SQLite es una base de datos completamente diferente a PostgreSQL que parece que está usando ahora.

Debería poder ejecutar sus consultas actuales a través de PDO :: query tal como lo hace hoy a menos que esté haciendo algo muy mal :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top