Panduan Pasukan Lucee MY

Datasource not found: selesaikan ralat datasource Lucee

Selesaikan ralat datasource not found dalam Lucee: kenali punca nama tidak sepadan, konteks salah dan sambungan gagal, serta cara semak dan baiki dengan pantas.

Datasource not found: selesaikan ralat datasource Lucee
0
Kandungan

Datasource not found: selesaikan ralat datasource Lucee

Ralat "datasource not found" dalam Lucee berlaku apabila nama datasource yang anda tulis dalam kod tidak wujud dalam konteks aplikasi yang sedang berjalan. Lucee tidak akan meneka nama yang anda maksudkan, sebaliknya ia berhenti serta-merta dan memaparkan senarai nama datasource yang sebenarnya tersedia. Artikel ini menunjukkan mesej ralat sebenar, punca-puncanya, dan pembetulan yang sudah diuji berjalan.

Jika anda belum tahu cara mendaftarkan datasource, baca dahulu panduan konfigurasi datasource.

Mesej ralat sebenar dalam Lucee

Orang ramai mencari ralat ini dengan frasa "datasource not found", tetapi Lucee sendiri menggunakan perkataan yang sedikit berbeza. Apabila kod merujuk nama yang tidak wujud, Lucee membalas dengan kod HTTP 500 dan mesej seperti berikut:

<cfquery name="q" datasource="kedaiSalah">
    SELECT id, nama FROM produk
</cfquery>
Lucee 7.1.2.54-SNAPSHOT Error (database)
Datasource [kedaiSalah] doesn't exist
available datasource names are [app_db,mydb,luceemy,kedai,mydsn,kedaiDB,kita]

Dua baris terakhir adalah bahagian yang paling berguna. Baris pertama memberitahu nama yang Lucee tidak jumpa, dan baris kedua menyenaraikan setiap nama datasource yang sebenarnya wujud dalam konteks itu. Dalam contoh di atas, kod mencari kedaiSalah, tetapi nama yang tersedia ialah kedai, bukan kedaiSalah. Ini punca paling kerap: nama dalam kod tidak sama dengan nama yang didaftarkan.

Punca 1: Nama dalam kod tidak sama dengan nama dalam Lucee Admin

Punca paling lazim ialah salah eja atau nama yang berbeza sama sekali. Perkara kecil seperti kedai lawan kedaiSalah, mydb lawan mydatabase, atau satu ruang tambahan pada hujung nama sudah cukup untuk membuat Lucee gagal mencari datasource.

Setiap nama datasource didaftarkan dengan satu rentetan yang tepat. Apabila anda menulis <cfquery datasource="mydb">, Lucee mengambil rentetan mydb dan mencarinya dalam senarai nama yang didaftarkan. Jika tiada padanan, ia terus melempar ralat. Cara paling cepat untuk mengesahkan nama yang betul ialah membaca senarai dalam mesej ralat itu sendiri, atau menyemak senarai datasource dalam Lucee Admin.

Punca 2: Datasource pada konteks yang salah

Lucee memisahkan datasource mengikut konteks. Konteks pelayan (server) boleh dikongsi oleh semua aplikasi dalam enjin itu, manakala konteks web terhad kepada satu aplikasi atau satu hos maya. Datasource yang anda cipta dalam Lucee Server Admin tidak semestinya kelihatan kepada aplikasi yang berjalan dalam konteks web, dan sebaliknya.

Gejala klasiknya ialah: datasource kelihatan dalam senarai admin, tetapi kod tetap membalas "doesn't exist". Ini bermakna datasource itu didaftarkan dalam konteks yang berbeza daripada konteks yang kod anda gunakan. Semak tempat anda mencipta datasource: bahagian Server atau bahagian Web dalam Lucee Administrator.

Punca 3: Datasource pada skop application berbanding admin

Ada tiga tempat datasource boleh didaftarkan: Lucee Server Admin, Lucee Web Admin, dan struktur this.datasources di dalam Application.cfc. Datasource yang ditakrifkan dalam this.datasources hidup pada skop aplikasi, bukan pada skop admin.

Akibatnya, datasource jenis ini hanya wujud selepas aplikasi itu dimuatkan, dan hanya untuk aplikasi dengan nama yang sama. Jika anda menukar this.name dalam Application.cfc, atau kod berjalan di bawah konteks aplikasi yang berbeza, datasource itu tidak akan kelihatan. Rig ujian untuk artikel ini mendaftarkan semua datasource melalui this.datasources, dan itulah sebabnya senarai app_db,mydb,luceemy,kedai,mydsn,kedaiDB,kita muncul dalam ralat di atas. Perbezaan skop application lawan admin ini dijelaskan lebih lanjut dalam artikel memahami skop dalam CFML.

Punca 4: Sambungan gagal, bukan nama salah

Nama datasource boleh betul, tetapi sambungan kepada pangkalan data tetap gagal. Mesej ralatnya berbeza sama sekali daripada "doesn't exist". Apabila pangkalan data tidak boleh dicapai, Lucee membalas dengan ralat sambungan seperti Connection is broken: "java.net.ConnectException: Connection refused (connect failed): 127.0.0.1:59999" [90067-232].

Ini bukan masalah nama. Ini bermakna pelayan pangkalan data mati, port salah, atau hos tidak boleh dicapai dari pelayan Lucee. Dalam persekitaran Docker, localhost merujuk kepada bekas Lucee itu sendiri dan bukan bekas pangkalan data, jadi anda perlu menggunakan nama perkhidmatan rangkaian. Bezakan kedua-dua jenis ralat ini sebelum membaiki, kerana pembetulannya berbeza: ralat nama diselesaikan dengan membetulkan ejaan, ralat sambungan diselesaikan dengan membetulkan hos, port atau menghidupkan semula pangkalan data.

Mengenai huruf besar dan huruf kecil

Ada tanggapan lama bahawa nama datasource dalam Lucee sensitif kepada huruf besar kecil. Dalam Lucee 7.1 tanggapan ini tidak benar. Apabila diuji dalam rig, kedai, Kedai dan KEDAI semuanya merujuk kepada datasource yang sama dan mengembalikan baris yang sama. Nama datasource dipadankan tanpa mengira huruf.

Jadi jika kod anda gagal, jangan buang masa membetulkan huruf besar kecil. Masalahnya hampir pasti nama yang berbeza, konteks yang salah, atau sambungan yang gagal, seperti yang disenaraikan di atas.

Kenapa ralat muncul sebagai 500 atau halaman kosong

Dalam persekitaran pembangunan, Lucee biasanya memaparkan halaman ralat penuh dengan mesej dan stack trace. Dalam persekitaran pengeluaran, output debug biasanya dimatikan, jadi pelawat hanya melihat halaman HTTP 500 atau halaman kosong, dan mesej sebenar hanya ditulis ke dalam log Lucee.

Ini bermakna ralat datasource boleh kelihatan seperti halaman rosak tanpa sebarang petunjuk. Apabila ini berlaku, semak fail log aplikasi seperti application.log dan exception.log dalam folder log Lucee untuk membaca mesej sebenar. Butiran membaca log ada dalam artikel log dan pemantauan CFML.

Cara mengesahkan datasource wujud

Cara paling mudah untuk menyemak sama ada nama datasource wujud ialah membaca struktur datasource daripada metadata aplikasi. Perhatikan bahawa fungsi getDatasource() dan datasourceExists() yang sering disebut dalam forum sebenarnya tidak wujud sebagai fungsi global dalam konteks web Lucee 7.1, jadi kod yang menggunakannya akan gagal dengan "No matching function found". Kaedah yang benar-benar berjalan ialah seperti berikut:

ds = getApplicationMetaData().datasources;
writeOutput("Senarai datasource: " & structKeyList(ds) & "<br>");
writeOutput("kedai wujud? " & structKeyExists(ds, "kedai") & "<br>");
writeOutput("kedaiSalah wujud? " & structKeyExists(ds, "kedaiSalah"));

Kod di atas, apabila dijalankan dalam rig, memulangkan senarai app_db,mydb,luceemy,kedai,mydsn,kedaiDB,kita, diikuti kedai wujud? true dan kedaiSalah wujud? false. Ini cara yang selamat untuk mengesahkan nama sebelum pertanyaan dijalankan, dan ia juga memberitahu anda senarai lengkap nama yang tersedia.

Membaca tetapan datasource dalam Lucee Admin

Untuk melihat tetapan penuh sesuatu datasource, buka Lucee Administrator melalui /lucee/admin/web.cfm, kemudian navigasi ke Services dan Datasource. Halaman itu menyenaraikan setiap datasource bersama jenis, hos, port dan nama pangkalan datanya. Klik nama datasource untuk melihat rentetan sambungan JDBC, nama pengguna dan tetapan kolam sambungan.

Gunakan halaman ini untuk menyemak tiga perkara: nama yang tepat untuk digunakan dalam kod, konteks tempat datasource itu didaftarkan, dan sama ada sambungannya ditandakan sah. Jika datasource muncul di sini tetapi kod anda masih gagal, semak semula konteks web lawan server.

Pembetulan yang benar-benar berjalan

Setelah nama dibetulkan, pertanyaan yang sama terus berjalan. Dalam rig, nama yang sah ialah kedai dengan jadual produk:

<cfquery name="qProduk" datasource="kedai">
    SELECT id, nama, harga, stok
    FROM produk
    ORDER BY id
</cfquery>
<cfoutput>#qProduk.recordCount# produk dijumpai.</cfoutput>

Kod ini memulangkan kod HTTP 200 dan output 5 produk dijumpai. dalam rig, membuktikan pertanyaan berjalan selepas nama datasource dibetulkan. Amalan terbaik ialah sentiasa menggunakan cfqueryparam untuk parameter, dan menetapkan satu nama datasource yang konsisten untuk seluruh projek.

Jadual ringkasan punca dan pembetulan

GejalaPuncaPembetulan
Datasource [x] doesn't existNama dalam kod tidak sama dengan nama didaftarkanBetulkan ejaan nama dalam kod
Datasource ada dalam admin tetapi kod gagalKonteks web lawan serverDaftar datasource dalam konteks yang betul
Datasource hanya wujud selepas aplikasi dimuatDidaftar dalam this.datasourcesPastikan nama aplikasi dan Application.cfc betul
Connection refused atau Connection is brokenPangkalan data mati, hos atau port salahBetulkan hos, port, atau hidupkan pangkalan data

Soalan Lazim

Kenapa Lucee kata datasource tidak wujud sedangkan saya sudah cipta dalam admin?

Kemungkinan besar datasource itu didaftarkan dalam konteks yang berbeza. Lucee memisahkan konteks server dan konteks web, jadi datasource yang dicipta dalam Server Admin tidak semestinya kelihatan kepada aplikasi web. Semak tempat anda menciptanya dan padankan dengan konteks yang kod anda gunakan.

Adakah fungsi getDatasource() atau datasourceExists() wujud dalam Lucee?

Tidak sebagai fungsi global dalam konteks web. Kedua-duanya membalas "No matching function found" apabila dipanggil dalam templat biasa. Guna getApplicationMetaData().datasources bersama structKeyExists untuk menyemak kewujudan datasource.

Adakah nama datasource sensitif kepada huruf besar kecil?

Tidak. Dalam Lucee 7.1, kedai, Kedai dan KEDAI semuanya merujuk kepada datasource yang sama. Jika kod anda gagal, punca sebenar ialah nama yang berbeza, konteks yang salah, atau sambungan yang gagal, bukan huruf besar kecil.

Kenapa halaman saya kosong dan bukannya memaparkan mesej ralat?

Dalam persekitaran pengeluaran, output debug biasanya dimatikan, jadi mesej ralat disembunyikan dan hanya muncul sebagai halaman 500 atau kosong. Mesej sebenar ditulis ke dalam log Lucee seperti application.log dan exception.log.

Bagaimana cara semak senarai datasource tanpa membuka admin?

Guna structKeyList(getApplicationMetaData().datasources) dalam templat CFML untuk mencetak semua nama datasource yang tersedia dalam konteks aplikasi semasa. Ini juga cara terpantas untuk mencari salah eja dalam kod.

Sumber

0 komen

0 komen

Log masuk untuk menjawab atau memberi komen.

Log masuk